For generating most, but not all figures in the manuscript.

library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
✓ ggplot2 3.3.0     ✓ purrr   0.3.3
✓ tibble  3.0.0     ✓ dplyr   0.8.5
✓ tidyr   1.0.2     ✓ stringr 1.4.0
✓ readr   1.3.1     ✓ forcats 0.5.0
── Conflicts ───────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(cowplot)

********************************************************
Note: As of version 1.0.0, cowplot does not change the
  default ggplot2 theme anymore. To recover the previous
  behavior, execute:
  theme_set(theme_cowplot())
********************************************************
library(lubridate)

Attaching package: ‘lubridate’

The following object is masked from ‘package:cowplot’:

    stamp

The following objects are masked from ‘package:dplyr’:

    intersect, setdiff, union

The following objects are masked from ‘package:base’:

    date, intersect, setdiff, union
library(mgcv)
Loading required package: nlme

Attaching package: ‘nlme’

The following object is masked from ‘package:dplyr’:

    collapse

This is mgcv 1.8-31. For overview type 'help("mgcv-package")'.
source("UVP_2017_library.R")
Loading required package: future
Parsed with column specification:
cols(
  Cruise = col_character(),
  Station = col_character(),
  `mon/dd/yyyy` = col_character(),
  `hh:mm` = col_time(format = ""),
  `Longitude [degrees east]` = col_double(),
  `Latitude [degrees north]` = col_double(),
  `Bottom Depth [m]` = col_double(),
  `Pressure [db]` = col_double(),
  `Temperature [degrees C]` = col_double(),
  `Temperature 2 [degrees C]` = col_double(),
  `Salinity [psu]` = col_double(),
  `Salinity 2 [psu]` = col_double(),
  `Fluorescense [mg/m^3]` = col_double(),
  `Beam Transmission [%]` = col_double(),
  PAR = col_double(),
  `Oxygen [umol/kg]` = col_double(),
  `Oxygen [% saturation]` = col_double()
)
theme_set(theme_cowplot())
cb10 <- c('#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a')

Particles Only

Read In Data

These read back in in UTC, since write_csv saves everthing into that time zone.

options(readr.default_locale=readr::locale(tz="Mexico/General"))
bes<- read_csv("dataOut/binned_EachSize.csv")
Parsed with column specification:
cols(
  .default = col_double(),
  project = col_character(),
  profile = col_character(),
  time = col_datetime(format = "")
)
See spec(...) for full column specifications.
bds <- read_csv("dataOut/binned_DepthSummary.csv")
Parsed with column specification:
cols(
  .default = col_double(),
  project = col_character(),
  profile = col_character(),
  time = col_datetime(format = "")
)
See spec(...) for full column specifications.
ues <- read_csv("dataOut/unbinned_EachSize.csv")
Parsed with column specification:
cols(
  project = col_character(),
  profile = col_character(),
  time = col_datetime(format = ""),
  depth = col_double(),
  psd_gam = col_double(),
  vol = col_double(),
  sizeclass = col_character(),
  lb = col_double(),
  ub = col_double(),
  binsize = col_double(),
  TotalParticles = col_double(),
  nparticles = col_double(),
  n_nparticles = col_double(),
  biovolume = col_double(),
  speed = col_double(),
  flux = col_double(),
  flux_fit = col_double(),
  GamPredictTP = col_double()
)
uds <- read_csv("dataOut/unbinned_DepthSummary.csv")
Parsed with column specification:
cols(
  .default = col_double(),
  project = col_character(),
  profile = col_character(),
  time = col_datetime(format = "")
)
See spec(...) for full column specifications.

Specify the base of the photic zone (which is inside of the OMZ) and the bae of the OMZ

PhoticBase <- 160
OMZBase <- 900
DVMBase <- 600
OMZTop <- 90

Figure 4

Total Particle numbers and particle size distribution slope

library(scales)

Attaching package: ‘scales’

The following object is masked from ‘package:purrr’:

    discard

The following object is masked from ‘package:readr’:

    col_factor
#https://stackoverflow.com/questions/30179442/plotting-minor-breaks-on-a-log-scale-with-ggplot
log_breaks = function(maj, radix=10) {
  function(x) {
    minx         = floor(min(logb(x,radix), na.rm=T)) - 1
    maxx         = ceiling(max(logb(x,radix), na.rm=T)) + 1
    n_major      = maxx - minx + 1
    major_breaks = seq(minx, maxx, by=1)
    if (maj) {
      breaks = major_breaks
    } else {
      steps = logb(1:(radix-1),radix)
      breaks = rep(steps, times=n_major) +
               rep(major_breaks, each=radix-1)
    }
    radix^breaks
  }
}
scale_x_log_eng = function(..., radix=10) {
  scale_x_continuous(...,
                     trans=log_trans(radix),
                     breaks=log_breaks(TRUE, radix),
                     minor_breaks=log_breaks(FALSE, radix))
}

ybreaks = seq(from = 1200, to = 0, by = -50)
ylabels = ybreaks
ylabels[c(FALSE, TRUE, TRUE, TRUE)] <- ""

#theme_set(theme_bw)


#theme_set(theme_cowplot)

PlotParticlesmany <- uds %>% 
  filter(project == "ETNP") %>%
  ggplot(aes(x = tot_nparticles, y = depth, shape = factor(day(time)), fill = hour(time))) +
 
  #geom_path(aes(x = psd_gam)) + 
  #geom_ribbon(aes(x = psd_gam, xmin = psd_gam - 2 * psd_seg, xmax = psd_gam + 2 * psd_seg), alpha = 0.1, outline_type = "lower") +
  geom_point(alpha = .6, size = 1.5, stroke = .5) +
  scale_y_reverse(limits = c(1200, 0),
                  breaks = ybreaks,
                  labels = ylabels) +
  scale_shape_manual(values = c(21:25)) +
  scale_fill_gradientn(breaks = c(0, 6, 12, 18, 24), colors = c("black", "blue", "white", "orange", "black"), limits = c(0, 24)) +
  scale_x_log10(breaks = c(10, 100, 1000), minor = c(5, 50, 500)) +
  #theme(legend.position = "none") +
  #scale_x_log_eng()+
  labs(y = "Depth (m)", x = "Particles / L") + 
  geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = OMZBase, color = "darkblue") +
  geom_hline(yintercept = OMZTop, color = "darkblue") +
  #geom_hline(yintercept = DVMBase, color = "darkgoldenrod", lty = "dashed") +
  theme(legend.position = "none") +
  theme(axis.title = element_text(size = 16),
        legend.title = element_text(size = 16),
        axis.text = element_text(size = 16),
        legend.text = element_text(size = 16))

PlotPSDmany <- uds %>% 
  filter(project == "ETNP") %>%
  ggplot(aes(x = psd, y = depth, shape = factor(day(time)), fill = hour(time))) +
 
  #geom_path(aes(x = psd_gam)) + 
  #geom_ribbon(aes(x = psd_gam, xmin = psd_gam - 2 * psd_seg, xmax = psd_gam + 2 * psd_seg), alpha = 0.1, outline_type = "lower") +
  geom_point(alpha = .6, size = 1.5, stroke = .5) +
  scale_y_reverse(limits = c(1200, 0), breaks = ybreaks, labels = ylabels) +
  scale_shape_manual(name = "Day", values = c(21:25)) +
  scale_fill_gradientn(name = "Hour",breaks = c(0, 6, 12, 18, 24), labels =  c("0", "6", "12", "18", "24"), colors = c("black", "blue", "white", "orange", "black"), limits = c(0, 24)) +
  labs(y = "Depth (m)", x = "Particle Size Distribution Slope") + 
  geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = OMZBase, color = "darkblue") +
  geom_hline(yintercept = OMZTop, color = "darkblue") +
  #geom_hline(yintercept = DVMBase, color = "darkgoldenrod", lty = "dashed") +
  coord_cartesian(clip = "off") +
  annotate(geom = "text", x = -2, y = 1100, label = "Proportionally \n fewer small \n particles", inherit.aes = FALSE, size = 6) +
  annotate(geom = "text", x = -4.2, y = 1100, label = "Proportionally \n more small \n particles", inherit.aes = FALSE, size = 6) +
  theme(axis.title.y = element_blank(),
        axis.title.x = element_text(size = 16),
        legend.title = element_text(size = 16),
        axis.text = element_text(size = 16),
        legend.text = element_text(size = 16))
Ignoring unknown parameters: inherit.aesIgnoring unknown parameters: inherit.aes
  # annotation_custom(
  #     grob = textGrob(label = "More big particles", hjust = 0, gp = gpar(cex = 12)),
  #     ymin = 0,      # Vertical position of the textGrob
  #     ymax = 0,
  #     xmin = 0,         # Note: The grobs are positioned outside the plot area
  #     xmax = 0)
  

plot_grid(
  PlotParticlesmany,
  PlotPSDmany,
  rel_widths = c(1, 2),
  labels = c("A", "B")
  )
Removed 266 rows containing missing values (geom_point).Removed 266 rows containing missing values (geom_point).

ggsave("figures/ParticlesPSDMany.png")
Saving 10 x 7 in image
ggsave("figures/ParticlesPSDMany.svg")
Saving 10 x 7 in image

Figure 3 Summary Statistics

Particle number vs depth and time

bdsAddTime <- bds %>%
  mutate(Hour = hour(time), Day = day(time))

FSG1 <- gam(tot_nparticles~ s(depth, k = 3) + s(Day, k = 3) + s(Hour, k = 4, bs = "cc"), knots = list(Hour = c(0, 24)), data = bdsAddTime %>% filter(depth >= PhoticBase & depth <=500 & project == "ETNP"))

FSG2 <- gam(tot_nparticles ~ s(depth, k = 3) + s(Day, k = 3), data = bdsAddTime %>% filter(depth >= PhoticBase & depth <=500 & project == "ETNP"))

FSG3 <- gam(tot_nparticles ~ s(depth, k = 3), data = bdsAddTime %>% filter(depth >= PhoticBase & depth <=500 & project == "ETNP"))

#FSG4 <- gam(tot_nparticles~ s(depth, k = 3)  + s(Hour, k = 4, bs = "cc"), knots = list(Hour = c(0, 24)), data = bdsAddTime %>% filter(depth >= PhoticBase & depth <=500 & project == "ETNP"))

summary(FSG1)

Family: gaussian 
Link function: identity 

Formula:
tot_nparticles ~ s(depth, k = 3) + s(Day, k = 3) + s(Hour, k = 4, 
    bs = "cc")

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  8.96538    0.09655   92.86   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
            edf Ref.df     F p-value  
s(depth) 1.0000  1.000 5.663  0.0202 *
s(Day)   1.4473  1.694 2.033  0.0921 .
s(Hour)  0.6402  2.000 0.502  0.2154  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.135   Deviance explained = 17.4%
GCV = 0.68369  Scale est. = 0.64319   n = 69
summary(FSG2)

Family: gaussian 
Link function: identity 

Formula:
tot_nparticles ~ s(depth, k = 3) + s(Day, k = 3)

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  8.96538    0.09727   92.17   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
           edf Ref.df     F p-value  
s(depth) 1.000  1.000 5.741  0.0194 *
s(Day)   1.469  1.718 2.214  0.0792 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.122   Deviance explained = 15.3%
GCV = 0.68744  Scale est. = 0.65288   n = 69
summary(FSG3)

Family: gaussian 
Link function: identity 

Formula:
tot_nparticles ~ s(depth, k = 3)

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   8.9654     0.1004   89.34   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
         edf Ref.df     F p-value  
s(depth)   1      1 5.736  0.0194 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.0651   Deviance explained = 7.89%
GCV = 0.71559  Scale est. = 0.69485   n = 69
#summary(FSG4)

summary(FSG1)$r.sq - summary(FSG2)$r.sq # extra R^2 explained by hour
[1] 0.01304448
summary(FSG2)$r.sq - summary(FSG3)$r.sq # extra explained by day
[1] 0.05646094
summary(FSG3)$r.sq # R^2 explained by depth
[1] 0.06511156

There is no statisticlly significant affect of time on particle number. If I take all of the time variables out and just compare to depth, there is a relationship to depth p = 0.02. But the R^2 is only 6.5%. Pretty weak

Particle size distribution vs depth and time

bdsAddTime <- bds %>%
  mutate(Hour = hour(time), Day = day(time))

FSG1 <- gam(psd~ s(depth, k = 3) + s(Day, k = 3) + s(Hour, k = 4, bs = "cc"), knots = list(Hour = c(0, 24)), data = bdsAddTime %>% filter(depth >= PhoticBase & depth <=500 & project == "ETNP"))

FSG2 <- gam(psd ~ s(depth, k = 3) + s(Day, k = 3), data = bdsAddTime %>% filter(depth >= PhoticBase & depth <=500 & project == "ETNP"))

FSG3 <- gam(psd ~ s(depth, k = 3), data = bdsAddTime %>% filter(depth >= PhoticBase & depth <=500 & project == "ETNP"))

FSG4 <- gam(psd~ s(depth, k = 3)  + s(Hour, k = 4, bs = "cc"), knots = list(Hour = c(0, 24)), data = bdsAddTime %>% filter(depth >= PhoticBase & depth <=500 & project == "ETNP"))

summary(FSG1)

Family: gaussian 
Link function: identity 

Formula:
psd ~ s(depth, k = 3) + s(Day, k = 3) + s(Hour, k = 4, bs = "cc")

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.90483    0.01809  -215.8   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
           edf Ref.df      F p-value    
s(depth) 1.848  1.977 88.789  <2e-16 ***
s(Day)   1.506  1.756  0.953  0.4853    
s(Hour)  1.361  2.000  2.260  0.0424 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.716   Deviance explained = 73.6%
GCV = 0.024631  Scale est. = 0.022591  n = 69
#summary(FSG2)
#summary(FSG3)
summary(FSG4)

Family: gaussian 
Link function: identity 

Formula:
psd ~ s(depth, k = 3) + s(Hour, k = 4, bs = "cc")

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.90483    0.01814  -215.2   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
           edf Ref.df      F p-value    
s(depth) 1.845  1.976 88.630  <2e-16 ***
s(Hour)  1.524  2.000  2.559  0.0409 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.714   Deviance explained = 72.8%
GCV = 0.024244  Scale est. = 0.022709  n = 69
summary(FSG3)$r.sq # R^2 of depth
[1] 0.6929817
summary(FSG4)$r.sq - summary(FSG3)$r.sq # Improvement from adding hour of the day
[1] 0.02133449
summary(FSG1)$r.sq - summary(FSG4)$r.sq # Improvement from then adding day of the week
[1] 0.001481684

PSD varies with depth, but doesn’t statistically relate to hor orday. Comparing the R2 values from models tells us that you explain 69% of varience with depth.

Figure S6

Comparing the two stations

S6A Number vs depth

PlotNParticlesEP <- uds %>% 
  filter(profile %in% c("stn_043", "p16n_100")) %>%
  ggplot(aes(x = tot_nparticles, y = depth, col = project, shape = project)) +
 geom_point(alpha = 0.7, size = 2, stroke = 1) +
  #geom_path(aes(x = tot_nparticles)) +
  #geom_ribbon(aes(x = psd_gam, xmin = psd_gam - 2 * psd_seg, xmax = psd_gam + 2 * psd_seg), alpha = 0.1) +
scale_y_reverse(limits = c(1000, 0)) + scale_x_log10() + scale_color_manual(values = c("gray20", "brown")) +
  labs(x = "Particles/L", y = "Depth (m)") +
  theme(legend.position = "none") +
  scale_shape_manual(values = c(1:5)) +
  geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = 200, color = "darkgreen") +
  geom_hline(yintercept = OMZBase, color = "darkblue") +
  geom_hline(yintercept = OMZTop, color = "darkblue")

PlotNParticlesEP

I removed one outlyer from p16 for visualization purposes (300 particles/l at surface)

S6B Particle size distribution vs depth

PlotPSDEP <- uds %>% 
  filter(profile %in% c("stn_043", "p16n_100")) %>%
  ggplot(aes(x = psd, y = depth, col = project, shape = project)) +
 geom_point(alpha = 0.7, size = 2, stroke = 1) +
  geom_path(aes(x = psd_gam)) +
  geom_ribbon(aes(x = psd_gam, xmin = psd_gam - 2 * psd_seg, xmax = psd_gam + 2 * psd_seg), alpha = 0.1) +
scale_y_reverse(limits = c(1000, 0)) + scale_color_manual(values = c("gray20", "brown"))  +
  scale_shape_manual(values = c(1:5)) + labs(y = "", x = "Particle Size Distribution Slope") +
  geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = 200, color = "darkgreen") +
  geom_hline(yintercept = OMZBase, color = "darkblue") +
  geom_hline(yintercept = OMZTop, color = "darkblue")

PlotPSDEP

Figure S6 Combined

plot_grid(PlotNParticlesEP, PlotPSDEP, rel_widths = c(2,3), labels = c("A", "B"))
Removed 1211 rows containing missing values (geom_point).Removed 1211 rows containing missing values (geom_point).Removed 1211 row(s) containing missing values (geom_path).

ggsave("figures/ParticlesAndPSD_ETNPVsP16.svg")
Saving 10 x 4 in image
ggsave("figures/ParticlesAndPSD_ETNPVsP16.png")
Saving 10 x 4 in image

Figure S7

Large and spall particle number, flux and size

mainParticleComponents <- bds %>%
  filter(profile %in% c("stn_043", "p16n_100")) %>%
  select(project, profile, depth,
         tot_nparticles, small_nparticles, big_nparticles,
         tot_psd = psd, small_psd, big_psd,
         tot_flux_fit, small_flux_fit, big_flux_fit) %>%
  pivot_longer(cols = -c("project", "profile", "depth")) %>%
  separate(name, c("size", "meas")) %>%
  mutate(meas = recode(meas, nparticles = "particles/L")) %>%
  mutate(meas = factor(meas, levels = c("particles/L", "flux", "psd"))) %>%
  mutate(size = factor(size, levels = c("small", "big", "tot"))) %>%
  mutate(size = recode(size, small = "micro-\naggregates \n < 500 μm", big = "marine\nsnow \n > 500 μm", tot = "total")) %>%
  pass()
Expected 2 pieces. Additional pieces discarded in 273 rows [7, 8, 9, 16, 17, 18, 25, 26, 27, 34, 35, 36, 43, 44, 45, 52, 53, 54, 61, 62, ...].
PlotFlx <- mainParticleComponents %>% 
  filter(meas != "psd") %>%
  ggplot(aes(y = depth, x = value, col = project, shape = project)) + facet_grid(size ~ meas, scales = "free_x") + geom_point(size = 2) + scale_y_reverse(limits = c(1000, 0)) + scale_x_log10() + theme(axis.title.x = element_blank(), legend.position = "none", strip.background.y = element_blank(), strip.text.y = element_blank(), plot.margin = unit(c(7,0,7,7), "pt")) + scale_color_manual(values = c(P16 = "brown", ETNP = "gray20")) + scale_shape_manual(values = c(1:5)) + theme(axis.text.x = element_text(angle = 90)) + geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = 200, color = "darkgreen") +
  geom_hline(yintercept = OMZBase, color = "darkblue") +
  geom_hline(yintercept = OMZTop, color = "darkblue")

PlotPSD <- mainParticleComponents %>% 
  filter(meas == "psd") %>%
  ggplot(aes(y = depth, x = value, col = project, shape = project)) + facet_grid(size~meas, scales = "free_x") + geom_point(size = 2) + scale_y_reverse(limits = c(1000, 0)) +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank(), axis.line.y = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank(), plot.margin = unit(c(7,7,26.5,0), "pt")) +
  scale_color_manual(values = c(P16 = "brown", ETNP = "gray20")) +  scale_shape_manual(values = c(1:5)) +  theme(axis.text.x = element_text(angle = 90)) + geom_hline(yintercept = PhoticBase, color = "darkgreen") +
    geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = 200, color = "darkgreen") +
  geom_hline(yintercept = OMZBase, color = "darkblue") +
  geom_hline(yintercept = OMZTop, color = "darkblue")

plot_grid(PlotFlx, PlotPSD, rel_widths = c(7, 5))
Removed 246 rows containing missing values (geom_point).Removed 123 rows containing missing values (geom_point).conversion failure on ' < 500 μm' in 'mbcsToSbcs': dot substituted for <ce>conversion failure on ' < 500 μm' in 'mbcsToSbcs': dot substituted for <bc>conversion failure on ' > 500 μm' in 'mbcsToSbcs': dot substituted for <ce>conversion failure on ' > 500 μm' in 'mbcsToSbcs': dot substituted for <bc>conversion failure on ' < 500 μm' in 'mbcsToSbcs': dot substituted for <ce>conversion failure on ' < 500 μm' in 'mbcsToSbcs': dot substituted for <bc>conversion failure on ' > 500 μm' in 'mbcsToSbcs': dot substituted for <ce>conversion failure on ' > 500 μm' in 'mbcsToSbcs': dot substituted for <bc>
ggsave("figures/BigVsSmall.svg")
Saving 7.29 x 4.5 in image
ggsave("figures/BigVsSmall.png")
Saving 7.29 x 4.5 in image

Flux small and flux tot track so closely because particle fractal dimension alpha, plus flux fractal dimension, gamma > |psd|. since the size distribution of the flux sould be PSD + ag (psd is negative in this case). Yo ucan see the variance at the one depth where psd is flatest at the very top.

Figure S4

Example particle size distributions

eg_dataline <- bds %>% 
  filter(profile == "stn_043", depth == 162.5)
eg_slope =  eg_dataline %>% pull(psd)
eg_icp = eg_dataline %>% pull(icp)
eg_vol = eg_dataline %>% pull(vol)

eg_datablock <- bes %>%
  filter(profile == "stn_043", depth == 162.5)


eg_lb = eg_datablock$lb
eg_binsize = eg_datablock$binsize
eg_nnp = exp(eg_icp + log(eg_lb) * eg_slope)

eg_np = eg_nnp * eg_binsize
eg_tp = eg_np * eg_vol
eg_df <- tibble(lb = eg_lb, n_nparticles = eg_nnp, nparticles = eg_np, TotalParticles = eg_tp)


EgNNP <- eg_datablock %>%
  ggplot(aes(x = lb, y = n_nparticles)) + geom_point() + scale_x_log10() + scale_y_log10() + 
  geom_path(data = eg_df) + labs(y = "Binsize & Volume Normalized \n Particles (#/L/mm)", x = "Size (mm)")

EgNP <- eg_datablock %>%
  ggplot(aes(x = lb, y = nparticles)) + geom_point() + scale_x_log10() + scale_y_log10() + 
  geom_path(data = eg_df) + labs(y = "Normalized Particles" , x = "Size (mm)")

EgTP <- eg_datablock %>%
  ggplot(aes(x = lb, y = TotalParticles)) + geom_point() + scale_x_log10() + scale_y_log10() + 
  geom_path(data = eg_df) + labs( y = "Total Particles Observed (#)", x = "Size (mm)")

plot_grid(EgNNP, EgTP, labels = c("A", "B"))
Transformation introduced infinite values in continuous y-axisTransformation introduced infinite values in continuous y-axis
ggsave("figures/ExamplePSD163m.png")
Saving 7.29 x 4.5 in image
ggsave("figures/ExamplePSD163m.svg")
Saving 7.29 x 4.5 in image

Figure 5A

Flux attenuation with respect ot depth and time. All extrapolated from the UVP and traps combined.

scientific_10 <- function(x) {parse(text=gsub("e\\+*", " %*% 10^", scales::scientific_format()(x))) }
scientific_10_b <- function(x) {parse(text=gsub("e\\+*", " %*% 10^", scales::scientific_format()(x))) }

scientific_10_c <- function(x) {
    xout <- gsub("1e", "10^{", format(x),fixed=TRUE)
    xout <- gsub("{-0", "{-", xout,fixed=TRUE)
    xout <- gsub("{+", "{", xout,fixed=TRUE)
    xout <- gsub("{0", "{", xout,fixed=TRUE)
    xout <- paste(xout,"}",sep="")
    return(parse(text=xout))
    
}

scale_x_log10nice <- function(name=NULL,omag=seq(-10,20),...) {
    breaks10 <- 10^omag
    scale_x_log10(breaks=breaks10,labels=scientific_10_c(breaks10),...)
}


#https://stackoverflow.com/questions/10762287/how-can-i-format-axis-labels-with-exponents-with-ggplot2-and-scales
#jacob_magnitude <- function(x){expression(10^round(log10(x)))}

cb10 <- c('#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a')
pltFlx <- bds %>% filter(project == "ETNP") %>% #filter(DFP > 1) %>% #filter(profile %in% c("stn_043", "p16n_100")) %>%
  ggplot(aes(y = depth, x = Flux_Smooth, shape = factor(day(time)), fill = hour(time), group = factor(time)))  + geom_point(size = 2, stroke = 1)+
  #geom_path() +
  scale_y_reverse(limits = c(1000, 0), breaks = ybreaks, labels = ylabels) +
  scale_x_log10nice()+
  #scale_x_log10() + 
   scale_color_gradient2(low = "darkgreen", mid = "gray80", high = "purple", midpoint = 10) + scale_shape_manual(name = "Day of Month", values = rep(21:25, 2)) + 
  scale_fill_gradientn(name = "Hour of Day", breaks = c(0, 6, 12, 18, 24), colors = c("black", "blue", "white", "orange", "black"), limits = c(0, 24)) +
  
  labs(x = bquote(Smoothed~Flux~(µmol~C/m^2/d)), y = "Depth (m)") +
  #labs(x = "moo", y = "Depth (m)") +
  geom_rect(data = data.frame(project = "ETNP"), aes(xmin = 20, xmax = 180, ymin = 75, ymax = 500), colour = "red", fill = NA, inherit.aes = FALSE) +
  theme(axis.text.x = element_text(angle = 90, vjust = .3), legend.spacing = unit(.1, "cm")) +
   geom_segment(aes(y = PhoticBase, yend = PhoticBase, x = 20, xend = 500), color = "darkgreen", stroke = 0.5)+
   geom_segment(aes(y = OMZBase, yend = OMZBase, x = 20, xend = 500), color = "darkblue", stroke = 0.5) +
   geom_segment(aes(y = OMZTop, yend = OMZTop, x = 20, xend = 500), color = "darkblue", stroke = 0.5)
Ignoring unknown parameters: strokeIgnoring unknown parameters: strokeIgnoring unknown parameters: stroke
  #geom_segment(aes(y = DVMBase, yend = DVMBase, x = 20, xend = 500), color = "darkgoldenrod", lty = "dashed", stroke = 0.5)
  
  #+ geom_hline(yintercept = OMZBase, color = "darkblue")



pltFlxNoLegend <- pltFlx + theme(legend.position = "none")
pltFlxLegend <- get_legend(pltFlx)
Removed 14 rows containing missing values (geom_point).
pltFlx

#plotly::ggplotly(plt1)

Figure 5B

Zooming in on where the action is happening

ylabels_fine <- ybreaks
ylabels_fine[c(FALSE, TRUE)] <- ""
#xbreaks_fine <- c(seq(from = 20, to = 50, by = 10), seq(from = 60, to = 180, by = 20))
xbreaks_fine <- seq(from = 20, to = 180, by = 10)
xlabels_fine <- xbreaks_fine
toss <- c(rep(FALSE, 5), rep(c(TRUE, FALSE), 6))
xlabels_fine[toss] <- ""
xlabels_fine[xlabels_fine %in% c(120, 160)] <- ""

#lenx <- length(xlabels_fine)
#xlabels_fine[c(lenx, lenx-2)] <- ""
cb10 <- c('#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a')
pltFlxZoom <- bds %>% filter(project == "ETNP" & depth <= 500 & depth >= 75) %>% #filter(profile %in% c("stn_043", "p16n_100")) %>%
  ggplot(aes(y = depth, x = Flux_Smooth, shape = factor(day(time)), fill = hour(time), group = factor(time))) + geom_point(size = 2, stroke = 1)+
  #geom_path() +
  scale_y_reverse(limits = c(500, 75), breaks = ybreaks, labels = ylabels_fine) +
  #scale_x_log10() +
  scale_x_log10(breaks = xbreaks_fine,
                labels = xlabels_fine,
                limits = c(20, 180)) +
   scale_color_gradient2(low = "darkgreen", mid = "gray80", high = "purple", midpoint = 10) + scale_shape_manual(values = rep(21:25, 2)) + 
  scale_fill_gradientn(breaks = c(0, 6, 12, 18, 24), colors = c("black", "blue", "white", "orange", "black")) +
  theme(axis.text.x = element_text(angle = 90)) +
labs(x = "Smoothed Flux", y = "Depth") + theme(legend.position = "none")+
geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = OMZTop, color = "darkblue") +
  theme(axis.text.x = element_text(vjust = .5))

pltFlxZoom

#plotly::ggplotly(plt1)

Figure 5C

Rate of change of flux, taken to the fifth root so one can see patterns.

cb10 <- c('#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a')
pltDelta3 <- bds %>% filter(project == "ETNP") %>% #filter(DFP > 1) %>% #filter(profile %in% c("stn_043", "p16n_100")) %>%
  ggplot(aes(y = depth, x = pracma::nthroot(DF/DZ, 5), shape = factor(day(time)), fill = hour(time), group = factor(time)))  + geom_point(size = 2, stroke = 1)+
  #geom_path() +
  scale_y_reverse(limits = c(1000, 0), breaks = ybreaks, labels = ylabels) +
  scale_x_continuous(limits = c(-2.1, .6), breaks = seq(from = -2, to = .75, by = 0.5)) +
  #scale_x_log10() +
   scale_color_gradient2(low = "darkgreen", mid = "gray80", high = "purple", midpoint = 10) + scale_shape_manual(name = "Day of Month", values = rep(21:25, 2)) + 
  scale_fill_gradientn(name = "Hour", breaks = c(0, 6, 12, 18, 24), colors = c("black", "blue", "white", "orange", "black")) +
  geom_vline(xintercept = 0) +
  labs(x = bquote((DF/DZ)^{1/5}~(µmol~C/m^3/d)^{1/5}), y = "Depth (m)") + theme(legend.pos = "none")+
  geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = OMZBase, color = "darkblue") +
  geom_hline(yintercept = OMZTop, color = "darkblue")
  #geom_hline(yintercept = DVMBase, color = "darkgoldenrod", lty = "dashed")
  #labs(x = "(DF/DZ) ^ 1/5 (µmol C/m^3/d) ^ 1/5")

pltDelta3

#plotly::ggplotly(plt1pos)

Combining the plots

Within panel drawing

pgTop <- ggdraw(pltFlxNoLegend 
       ) +
  draw_plot(pltFlxZoom, .4, .25, .55, .60) +
  draw_plot_label(
    c("","B"),
    c(.05, 0.55),
    c(1, 0.85),
    size = 16
  )
Removed 14 rows containing missing values (geom_point).
pgTop

pgBottom <- plot_grid(pltDelta3, pltFlxLegend , rel_widths = c(3, 1), labels = c(“C”, ""), label_size = 14)

I don’t know whats going on below here

pgBottom <- pltDelta3  + geom_rect(aes(xmin = -2, xmax = -1.15, ymin = 170, ymax = 1000), colour = "gray50", fill = "white", inherit.aes = FALSE) + draw_plot(pltFlxLegend , -1.9, -575, .7)
pgBoth <- plot_grid(pgTop + theme(plot.margin = unit(c(0, 0, 0, 0), units = "cm")),
                    pgBottom + theme(plot.margin = unit(c(0, 0, 0, 0), units = "cm")),
                    ncol = 1, rel_heights = c(4, 4), labels = c("A", "C"), label_size = 16)
Removed 33 rows containing missing values (geom_point).
pgBoth


ggsave("figures/FluxDeepDive.png")
Saving 5 x 9 in image
ggsave("figures/FluxDeepDive.svg")
Saving 5 x 9 in image

Summary stats

Test for day to day and hourly variability in rate of change of flux (fifth root transformed)

There is variability with respect to depth, and day and hour Depth p = 0.03 R^2 = 0.088. Add affect of day p = 0.004, extra R^2 = 0.11, Add affect of hour p = 0.02 extra R2 = 0.12

bdsAddTime <- bds %>% 
  mutate(Hour = hour(time) + minute(time)/60, Day = day(time) + hour(time)/24 + minute(time)/24/60)

DFG1 <- gam(pracma::nthroot(DF/DZ, 5)~ s(depth, k = 3) + s(Day, k = 3) + s(Hour, k = 4, bs = "cc"), knots = list(Hour = c(0, 24)), data = bdsAddTime %>% filter(depth >= 250 & depth <=500 & project == "ETNP"))

DFG2 <- gam(pracma::nthroot(DF/DZ, 5) ~ s(depth, k = 3) + s(Day, k = 3), data = bdsAddTime %>% filter(depth >= 250 & depth <=500 & project == "ETNP"))

DFG3 <- gam(pracma::nthroot(DF/DZ, 5) ~ s(depth, k = 3), data = bdsAddTime %>% filter(depth >= 250 & depth <=500 & project == "ETNP"))

DFG_DayOnly <- gam(pracma::nthroot(DF/DZ, 5) ~  s(Day, k = 3), data = bdsAddTime %>% filter(depth >= 250 & depth <=500 & project == "ETNP"))

DFG_NoFifth <- gam(pracma::nthroot(DF/DZ, 1)~ s(depth, k = 3) + s(Day, k = 3) + s(Hour, k = 4, bs = "cc"), knots = list(Hour = c(0, 24)), data = bdsAddTime %>% filter(depth >= 250 & depth <=500 & project == "ETNP"))

summary(DFG1)

Family: gaussian 
Link function: identity 

Formula:
pracma::nthroot(DF/DZ, 5) ~ s(depth, k = 3) + s(Day, k = 3) + 
    s(Hour, k = 4, bs = "cc")

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept) -0.18385    0.05998  -3.065  0.00407 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
           edf Ref.df     F p-value  
s(depth) 1.672  1.893 3.955  0.0606 .
s(Day)   1.907  1.991 4.661  0.0190 *
s(Hour)  0.774  2.000 0.658  0.1961  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.254   Deviance explained = 33.4%
GCV = 0.1732  Scale est. = 0.15112   n = 42
summary(DFG_DayOnly)

Family: gaussian 
Link function: identity 

Formula:
pracma::nthroot(DF/DZ, 5) ~ s(Day, k = 3)

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept) -0.18385    0.06485  -2.835  0.00722 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
         edf Ref.df     F p-value  
s(Day) 1.873  1.984 3.391  0.0404 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.129   Deviance explained = 16.8%
GCV = 0.18962  Scale est. = 0.17665   n = 42
summary(DFG_NoFifth)

Family: gaussian 
Link function: identity 

Formula:
pracma::nthroot(DF/DZ, 1) ~ s(depth, k = 3) + s(Day, k = 3) + 
    s(Hour, k = 4, bs = "cc")

Parametric coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.028354   0.007924  -3.578 0.000979 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
               edf Ref.df     F p-value   
s(depth) 1.809e+00  1.963 9.247 0.00138 **
s(Day)   1.827e+00  1.970 3.361 0.06222 . 
s(Hour)  1.396e-08  2.000 0.000 0.71927   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.341   Deviance explained = 39.9%
GCV = 0.0029647  Scale est. = 0.0026375  n = 42
# summary(DFG2)
# summary(DFG3)
# 
# summary(DFG1)$r.sq - summary(DFG2)$r.sq
# summary(DFG2)$r.sq - summary(DFG3)$r.sq
# summary(DFG3)$r.sq

Time is now continuous day and hour

Plot of the gams above

#plot.new()
FluxGamPlot <- function(){
  par(mfrow = c(2,2))
  plot(DFG1)
  abline(h = 0, col = "gray30", lwd = 2)
  mtext(expression(bold("C")), side = 3, line = 0, adj = 0, cex = 2)
  par(mfg = c(1,1))
  abline(h = 0, col = "gray30", lwd = 2)
  mtext(expression(bold("A")), side = 3, line = 0, adj = 0, cex = 2)
  par(mfg = c(1,2))
  abline(h = 0, col = "gray30", lwd = 2)
  mtext(expression(bold("B")), side = 3, line = 0, adj = 0, cex = 2)
}

FluxGamPlot()

png(filename = "./figures/FluxGamPlot.png", width = 10, height = 8, units = "in", res = 200)
FluxGamPlot()
dev.off()
png 
  2 

Figure 7

Difference from model expectations

(u mol C / m^3 / day)

disagFig <- bds %>% filter(project == "ETNP") %>%
  ggplot(aes(y = depth, x = pracma::nthroot(ospsDZ, 3), shape = factor(day(time)), fill = hour(time), group = factor(time))) + geom_point(size = 2) +
  scale_y_reverse(limits = c(1000, 0), breaks = ybreaks, labels = ylabels) +
  scale_x_continuous(limits = c(-1, 1)) +
  geom_vline(xintercept = 0) +   scale_shape_manual(name = "Day of Month", values = rep(21:25, 2)) +
  #labs(x = bquote("Observed - Modeled Small Particle Flux"~(μmol/m^3/day)), y = "Depth (m)") +
  labs(x = paste("Deviation from Model", expression((μmol/m^3/day))), y = "Depth (m)") +
  scale_fill_gradientn(name = "Hour of Day", breaks = c(0, 6, 12, 18, 24), colors = c("black", "blue", "white", "orange", "black")) +
  geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = OMZBase, color = "darkblue") +
  geom_hline(yintercept = OMZTop, color = "darkblue") #+
  #geom_hline(yintercept = DVMBase, color = "darkgoldenrod", lty = "dashed")
disagFig

#ggsave("..figures/FluxSizeShift.svg"

 ggsave("figures/FluxSizeShift.png")
Saving 6 x 4 in image
 ggsave("figures/FluxSizeShift.svg")
Saving 6 x 4 in image

Summary statistics

# bdsAddTime <- bds %>%
#   mutate(Hour = hour(time), Day = day(time))

bdsAddTime <- bds %>%
  mutate(Hour = hour(time) + minute(time)/60, Day = day(time) + hour(time)/24 + minute(time)/24/60)

OZG1 <- gam(ospsDZ ~ s(depth, k = 3) + s(Day, k = 3) + s(Hour, k = 4, bs = "cc"), knots = list(Hour = c(0, 24)), data = bdsAddTime %>% filter(depth >= PhoticBase & depth <=500 & project == "ETNP"))

OZG2 <- gam(ospsDZ ~ s(depth, k = 3) + s(Day, k = 3), data = bdsAddTime %>% filter(depth >= PhoticBase & depth <=500 & project == "ETNP"))

OZG3 <- gam(ospsDZ ~ s(depth, k = 3), data = bdsAddTime %>% filter(depth >= PhoticBase & depth <=500 & project == "ETNP"))

summary(OZG1)

Family: gaussian 
Link function: identity 

Formula:
ospsDZ ~ s(depth, k = 3) + s(Day, k = 3) + s(Hour, k = 4, bs = "cc")

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.08042    0.01049   7.665 1.33e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
           edf Ref.df      F  p-value    
s(depth) 1.584  1.827 19.185 4.77e-06 ***
s(Day)   1.771  1.946  8.926  0.00173 ** 
s(Hour)  1.266  2.000  1.964  0.05140 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.416   Deviance explained = 45.5%
GCV = 0.0082683  Scale est. = 0.0075948  n = 69
summary(OZG2)

Family: gaussian 
Link function: identity 

Formula:
ospsDZ ~ s(depth, k = 3) + s(Day, k = 3)

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.08042    0.01079   7.451 2.85e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
           edf Ref.df      F  p-value    
s(depth) 1.558  1.805 18.393 8.14e-06 ***
s(Day)   1.838  1.974  6.924  0.00415 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.382   Deviance explained = 41.3%
GCV = 0.0085853  Scale est. = 0.0080382  n = 69
summary(OZG3)

Family: gaussian 
Link function: identity 

Formula:
ospsDZ ~ s(depth, k = 3)

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.08042    0.01169   6.877 2.59e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
           edf Ref.df     F  p-value    
s(depth) 1.453    1.7 17.31 2.23e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.274   Deviance explained =   29%
GCV = 0.0097831  Scale est. = 0.0094354  n = 69
summary(OZG1)$r.sq - summary(OZG2)$r.sq # Extra from Hour
[1] 0.03410746
summary(OZG2)$r.sq - summary(OZG3)$r.sq # Extrafrom Day
[1] 0.1074734
summary(OZG3)$r.sq # Depth
[1] 0.2741944

Plot of those gams Figure S10

OSMSGamPlot <- function(){
  par(mfrow = c(2,2))
  plot(OZG1)
  
  par(mfg = c(1,1))
  abline(h = 0, col = "gray30", lwd = 2)
  mtext(expression(bold("A")), side = 3, line = 0, adj = 0, cex = 2)
  par(mfg = c(1,2))
  abline(h = 0, col = "gray30", lwd = 2)
  mtext(expression(bold("B")), side = 3, line = 0, adj = 0, cex = 2)
  par(mfg = c(2,1))
  abline(h = 0, col = "gray30", lwd = 2)
  mtext(expression(bold("C")), side = 3, line = 0, adj = 0, cex = 2)
}

OSMSGamPlot()

png(filename = "./figures/OSMSGamPlot.png", width = 10, height = 8, units = "in", res = 200)
OSMSGamPlot()

dev.off()
png 
  2 

Figure 3

Trap data

trapFlux3 <- read_csv("dataOut/fluxMS_distilled.csv")
Parsed with column specification:
cols(
  Class = col_character(),
  Depth = col_double(),
  TrapID = col_character(),
  TrapType = col_character(),
  SampleType = col_character(),
  C_flux = col_double(),
  C_flux_umol = col_double()
)
UVPFluxComb <- read_csv("dataOut/CombinedProfileFluxEst_DS.csv")
Parsed with column specification:
cols(
  depth = col_double(),
  Flux = col_double()
)
UVPFluxOE <- read_csv("dataOut/ObservedVsExpectedFlux.csv")
Parsed with column specification:
cols(
  depth = col_double(),
  tn_flux = col_double(),
  profile = col_character(),
  project = col_character(),
  time = col_character(),
  tot_flux2 = col_double()
)

fluxMS_distilled_toPlot <- trapFlux3 %>%
  mutate(SampleType = recode(SampleType, `plus.p` = "plus-particles", top = "top-collector"))

Remove traps where mass spec didn’t work correctly 2-17 150 1-12 73m 1-12 148 2-14 100 |(TrapID == “2-17” & Depth == 150)

fluxMS_distilled_toPlot2 <- fluxMS_distilled_toPlot %>%
 filter(!((TrapID == "1-12") | (TrapID == "2-14" & Depth == 100)|(TrapID == "2-17" & Depth == 150)))
#fluxMS_distilled_toPlot2

Traps where mass spec didn’t work.

UVPFluxPlot00 <- UVPFluxComb %>% 
  ggplot(aes(y = depth))  + scale_y_reverse(limits = c(1000, 0)) +
  scale_x_continuous(limits = c(0, 200)) +
  geom_point(aes(y = Depth, x = C_flux_umol, shape = TrapType, ID = TrapID),
             colour = "black", stroke = 1, size = 5, data = fluxMS_distilled_toPlot2) +
  geom_line(aes(x = Flux), size = 1, color = "black") +
  geom_point(aes(x = -1, y = -1, size = "UVP Estimate")) + # dummy point for the legend
  geom_point(aes(x = tot_flux2), size = 3, shape = 21, color = "white", fill = "black", data = UVPFluxOE) +
scale_shape_manual(values = c(25, 22))+
  scale_size_manual(values = 1, name = "") +
  ylab("Depth (m)") +
  #xlab(expression(Flux µmolC/m^2/day)) +
  xlab(expression(paste("x axis ", ring(A)^2))) +
  xlab(expression(paste("Flux (µ mol C/", m^2, "/day)"))) +
  
  guides(fill = guide_legend(override.aes = list(shape = 21))) +
  geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = OMZBase, color = "darkblue") +
  geom_hline(yintercept = OMZTop, color = "darkblue")
Ignoring unknown aesthetics: ID
  theme_cowplot() + 
  theme(
        legend.position = c(0.5, 0.4),
        legend.box.background = element_rect(color = "black", size = 0.5),
        legend.margin = margin(-10, 5, 10, 5)
  ) 
List of 93
 $ line                      :List of 6
  ..$ colour       : chr "black"
  ..$ size         : num 0.5
  ..$ linetype     : num 1
  ..$ lineend      : chr "butt"
  ..$ arrow        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_line" "element"
 $ rect                      :List of 5
  ..$ fill         : logi NA
  ..$ colour       : logi NA
  ..$ size         : num 0.5
  ..$ linetype     : num 1
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_rect" "element"
 $ text                      :List of 11
  ..$ family       : chr ""
  ..$ face         : chr "plain"
  ..$ colour       : chr "black"
  ..$ size         : num 14
  ..$ hjust        : num 0.5
  ..$ vjust        : num 0.5
  ..$ angle        : num 0
  ..$ lineheight   : num 0.9
  ..$ margin       : 'margin' num [1:4] 0pt 0pt 0pt 0pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ title                     : NULL
 $ aspect.ratio              : NULL
 $ axis.title                : NULL
 $ axis.title.x              :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 1
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 3.5pt 0pt 0pt 0pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.title.x.top          :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 0
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0pt 0pt 3.5pt 0pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.title.x.bottom       : NULL
 $ axis.title.y              :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 1
  ..$ angle        : num 90
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0pt 3.5pt 0pt 0pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.title.y.left         : NULL
 $ axis.title.y.right        :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 0
  ..$ angle        : num -90
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0pt 0pt 0pt 3.5pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text                 :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : chr "black"
  ..$ size         : num 12
  ..$ hjust        : NULL
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.x               :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 1
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 3pt 0pt 0pt 0pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.x.top           :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 0
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0pt 0pt 3pt 0pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.x.bottom        : NULL
 $ axis.text.y               :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 1
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0pt 3pt 0pt 0pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.y.left          : NULL
 $ axis.text.y.right         :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 0
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0pt 0pt 0pt 3pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.ticks                :List of 6
  ..$ colour       : chr "black"
  ..$ size         : num 0.5
  ..$ linetype     : NULL
  ..$ lineend      : NULL
  ..$ arrow        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_line" "element"
 $ axis.ticks.x              : NULL
 $ axis.ticks.x.top          : NULL
 $ axis.ticks.x.bottom       : NULL
 $ axis.ticks.y              : NULL
 $ axis.ticks.y.left         : NULL
 $ axis.ticks.y.right        : NULL
 $ axis.ticks.length         : 'unit' num 3.5pt
  ..- attr(*, "valid.unit")= int 8
  ..- attr(*, "unit")= chr "pt"
 $ axis.ticks.length.x       : NULL
 $ axis.ticks.length.x.top   : NULL
 $ axis.ticks.length.x.bottom: NULL
 $ axis.ticks.length.y       : NULL
 $ axis.ticks.length.y.left  : NULL
 $ axis.ticks.length.y.right : NULL
 $ axis.line                 :List of 6
  ..$ colour       : chr "black"
  ..$ size         : num 0.5
  ..$ linetype     : NULL
  ..$ lineend      : chr "square"
  ..$ arrow        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_line" "element"
 $ axis.line.x               : NULL
 $ axis.line.x.top           : NULL
 $ axis.line.x.bottom        : NULL
 $ axis.line.y               : NULL
 $ axis.line.y.left          : NULL
 $ axis.line.y.right         : NULL
 $ legend.background         : list()
  ..- attr(*, "class")= chr [1:2] "element_blank" "element"
 $ legend.margin             : 'margin' num [1:4] -10pt 5pt 10pt 5pt
  ..- attr(*, "valid.unit")= int 8
  ..- attr(*, "unit")= chr "pt"
 $ legend.spacing            : 'unit' num 14pt
  ..- attr(*, "valid.unit")= int 8
  ..- attr(*, "unit")= chr "pt"
 $ legend.spacing.x          : NULL
 $ legend.spacing.y          : NULL
 $ legend.key                : list()
  ..- attr(*, "class")= chr [1:2] "element_blank" "element"
 $ legend.key.size           : 'unit' num 15.4pt
  ..- attr(*, "valid.unit")= int 8
  ..- attr(*, "unit")= chr "pt"
 $ legend.key.height         : NULL
 $ legend.key.width          : NULL
 $ legend.text               :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : 'rel' num 0.857
  ..$ hjust        : NULL
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ legend.text.align         : NULL
 $ legend.title              :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 0
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ legend.title.align        : NULL
 $ legend.position           : num [1:2] 0.5 0.4
 $ legend.direction          : NULL
 $ legend.justification      : chr [1:2] "left" "center"
 $ legend.box                : NULL
 $ legend.box.just           : NULL
 $ legend.box.margin         : 'margin' num [1:4] 0pt 0pt 0pt 0pt
  ..- attr(*, "valid.unit")= int 8
  ..- attr(*, "unit")= chr "pt"
 $ legend.box.background     :List of 5
  ..$ fill         : NULL
  ..$ colour       : chr "black"
  ..$ size         : num 0.5
  ..$ linetype     : NULL
  ..$ inherit.blank: logi FALSE
  ..- attr(*, "class")= chr [1:2] "element_rect" "element"
 $ legend.box.spacing        : 'unit' num 14pt
  ..- attr(*, "valid.unit")= int 8
  ..- attr(*, "unit")= chr "pt"
 $ panel.background          : list()
  ..- attr(*, "class")= chr [1:2] "element_blank" "element"
 $ panel.border              : list()
  ..- attr(*, "class")= chr [1:2] "element_blank" "element"
 $ panel.spacing             : 'unit' num 7pt
  ..- attr(*, "valid.unit")= int 8
  ..- attr(*, "unit")= chr "pt"
 $ panel.spacing.x           : NULL
 $ panel.spacing.y           : NULL
 $ panel.grid                : list()
  ..- attr(*, "class")= chr [1:2] "element_blank" "element"
 $ panel.grid.major          : NULL
 $ panel.grid.minor          : NULL
 $ panel.grid.major.x        : NULL
 $ panel.grid.major.y        : NULL
 $ panel.grid.minor.x        : NULL
 $ panel.grid.minor.y        : NULL
 $ panel.ontop               : logi FALSE
 $ plot.background           : list()
  ..- attr(*, "class")= chr [1:2] "element_blank" "element"
 $ plot.title                :List of 11
  ..$ family       : NULL
  ..$ face         : chr "bold"
  ..$ colour       : NULL
  ..$ size         : 'rel' num 1.14
  ..$ hjust        : num 0
  ..$ vjust        : num 1
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0pt 0pt 7pt 0pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ plot.title.position       : chr "panel"
 $ plot.subtitle             :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : 'rel' num 0.857
  ..$ hjust        : num 0
  ..$ vjust        : num 1
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0pt 0pt 7pt 0pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ plot.caption              :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : 'rel' num 0.786
  ..$ hjust        : num 1
  ..$ vjust        : num 1
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 7pt 0pt 0pt 0pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ plot.caption.position     : chr "panel"
 $ plot.tag                  :List of 11
  ..$ family       : NULL
  ..$ face         : chr "bold"
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 0
  ..$ vjust        : num 0.7
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ plot.tag.position         : num [1:2] 0 1
 $ plot.margin               : 'margin' num [1:4] 7pt 7pt 7pt 7pt
  ..- attr(*, "valid.unit")= int 8
  ..- attr(*, "unit")= chr "pt"
 $ strip.background          :List of 5
  ..$ fill         : chr "grey80"
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ linetype     : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_rect" "element"
 $ strip.background.x        : NULL
 $ strip.background.y        : NULL
 $ strip.placement           : chr "inside"
 $ strip.text                :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : 'rel' num 0.857
  ..$ hjust        : NULL
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 3.5pt 3.5pt 3.5pt 3.5pt
  .. ..- attr(*, "valid.unit")= int 8
  .. ..- attr(*, "unit")= chr "pt"
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ strip.text.x              : NULL
 $ strip.text.y              :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : NULL
  ..$ angle        : num -90
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ strip.switch.pad.grid     : 'unit' num 3.5pt
  ..- attr(*, "valid.unit")= int 8
  ..- attr(*, "unit")= chr "pt"
 $ strip.switch.pad.wrap     : 'unit' num 3.5pt
  ..- attr(*, "valid.unit")= int 8
  ..- attr(*, "unit")= chr "pt"
 $ strip.text.y.left         :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : NULL
  ..$ angle        : num 90
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 - attr(*, "class")= chr [1:2] "theme" "gg"
 - attr(*, "complete")= logi TRUE
 - attr(*, "validate")= logi TRUE
# UVPFluxPlot <- UVPFluxPlot00 +
#   geom_rect(data = data.frame(project = "ETNP"), aes(xmin = 15, xmax = 32, ymin = 45, ymax = 195), colour = "red", fill = NA, inherit.aes = FALSE)

UVPFluxPlot00

ggsave("figures/FittedFlux.png")
Saving 7.29 x 4.5 in image
ggsave("figures/FittedFlux.svg")
Saving 7.29 x 4.5 in image

Figure S2

Example particle size distribution

TPPlot <- bes %>% filter(profile == "stn_043") %>% group_by(lb) %>% ggplot(aes(x = TotalParticles, y = depth, col = log(lb), group = lb)) + scale_y_reverse(limits = c(1000, 0)) + geom_point() + scale_x_log10() + scale_color_viridis_c() + geom_path() + geom_vline(xintercept = 1) + geom_vline(xintercept = 5) + labs(y = "Depth (m)", x = "TotalParticles Observed (#)") +
  geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = OMZBase, color = "darkblue") +
  geom_hline(yintercept = OMZTop, color = "darkblue")

nnpPlot <- bes %>% filter(profile == "stn_043") %>% group_by(lb) %>% ggplot(aes(x = n_nparticles, y = depth, col = log(lb), group = lb)) + scale_y_reverse(limits = c(1000, 0)) + geom_point() + scale_x_log10() + scale_color_viridis_c() + geom_path() +
  #geom_vline(xintercept = 1) + geom_vline(xintercept = 5) +
  labs(y = "Depth (m)", x = "Binsize and Volume Normalized Particles (#/L/mm)") +
  geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = OMZBase, color = "darkblue") +
  geom_hline(yintercept = OMZTop, color = "darkblue")

FitPlot <- bes %>% filter(profile == "stn_043") %>% group_by(lb) %>% ggplot(aes(x = nnp_smooth, xmin = nnp_lower, xmax = nnp_upper, y = depth, col = log(lb), group = lb)) + scale_y_reverse(limits = c(1000, 0)) + geom_point() + scale_x_log10() + scale_color_viridis_c() + geom_path() +
  #geom_vline(xintercept = 1) + geom_vline(xintercept = 5) +
  labs(y = "Depth (m)", x = "Smoothed - Normalized Particles (#/L/mm)") + geom_errorbar(width = 10, alpha = 0.5) +
  geom_hline(yintercept = PhoticBase, color = "darkgreen") +
  geom_hline(yintercept = OMZBase, color = "darkblue") +
  geom_hline(yintercept = OMZTop, color = "darkblue")

npLegend <- get_legend(FitPlot + theme(legend.box.margin = margin(0, 0, 40, 200)) + labs(col = expression(log[e](Size (mm)))))
Removed 325 rows containing missing values (geom_point).Removed 325 row(s) containing missing values (geom_path).
plot_grid(
  TPPlot + theme(legend.position = "none"),
  nnpPlot + theme(legend.position = "none"),
  npLegend ,
  FitPlot + theme(legend.position = "none"), 
  labels = c("A", "B", "", "C")
)
Transformation introduced infinite values in continuous x-axisTransformation introduced infinite values in continuous x-axisRemoved 325 rows containing missing values (geom_point).Removed 325 row(s) containing missing values (geom_path).Transformation introduced infinite values in continuous x-axisTransformation introduced infinite values in continuous x-axisRemoved 325 rows containing missing values (geom_point).Removed 325 row(s) containing missing values (geom_path).Removed 325 rows containing missing values (geom_point).Removed 325 row(s) containing missing values (geom_path).

ggsave("figures/AllParticleSizes.svg")
Saving 10 x 6.18 in image
ggsave("figures/AllParticleSizes.png")
Saving 10 x 6.18 in image

Figure 6

Weber Bianchi Figs

Just station 043

We are smoothing the station 043 data, with respect to depth and time. We are using this station because it is the only one to extend past 2000m. We find that the other profiles seem to give strange values near the ends of the ranges of the gams.

SameGam <- gam(TotalParticles ~s(log(lb), log(depth)), offset = log(vol * binsize), family = nb(),
    data = bes %>% filter(project == "ETNP", depth <= 2000, profile == "stn_043")) # Looks good!
gam.check(SameGam)


Method: REML   Optimizer: outer newton
full convergence after 4 iterations.
Gradient range [1.180573e-06,5.441536e-06]
(score 2243.109 & scale 1).
Hessian positive definite, eigenvalue range [5.359006,135.6228].
Model rank =  30 / 30 

Basis dimension (k) checking results. Low p-value (k-index<1) may
indicate that k is too low, especially if edf is close to k'.

                      k' edf k-index p-value    
s(log(lb),log(depth)) 29  21    0.61  <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

besE <- bes %>% filter(project == "ETNP")

lb_new <- exp(seq(from = log(0.1), to = log(2.1), by = 0.05))
ub_new <- lead(lb_new)
binsize_new <- ub_new - lb_new

lbbs <- tibble(lb = lb_new, ub = ub_new, binsize = binsize_new)

Expanded <- expand_grid(lb = exp(seq(from = log(0.1), to = log(2), by = 0.05)), depth = seq(from = 20, to = 2000, by = 20), time = as.factor(unique(besE$time))) %>% left_join(lbbs, by = "lb")

Pred <- exp(predict(SameGam, Expanded))
ToPlot <- bind_cols(Expanded, nnparticles = Pred) %>% mutate(time = as.character(time)) %>% mutate(nparticles = nnparticles * binsize)
WBColorMap <- ToPlot %>% filter(lb <= 2) %>%
  ggplot(aes(x = lb, y = depth, fill = log10(nnparticles), z = log10(nnparticles))) + geom_tile() + scale_fill_viridis_c(name = expression(log[10](Particles/m^3/mm))) + scale_y_reverse() + scale_x_log10() + geom_contour(color = "black") + geom_hline(yintercept = 160, color = "darkgreen") + geom_hline(yintercept = OMZBase, color = "darkblue") + labs(y = "Depth (m)", x = "Size (mm)") + geom_hline(yintercept = OMZTop, color = "darkblue")
WBColorMap

mbGam <- ToPlot %>% group_by(depth)  %>% nest() %>%
  mutate(mod = map(data, ~gam(log(nnparticles) ~ log(lb), family = gaussian(), data = .))) %>% 
  mutate(psd = map_dbl(mod, ~summary(.)$p.coeff[2])) 

Particle size distribution, smoothed over all stations

pWBPSD <- mbGam %>%
  ggplot(aes(x = psd, y = depth)) + geom_path() + scale_y_reverse()  + geom_hline(yintercept = 160, color = "darkgreen") + geom_hline(yintercept =  OMZBase, color = "darkblue") + labs(y = "Depth (m)", x = "Particle Size Distribution Slope") + geom_hline(yintercept = OMZTop, color = "darkblue")
pWBPSD

Small Particle Biomass

PubDf <- ToPlot %>% mutate(ubiomass = nparticles * lb ^ ag_global) %>% filter(lb < 0.5) %>% group_by(depth) %>% summarize(ubiomass = sum(ubiomass)) %>% ungroup()
photicBiomass <- PubDf %>% filter(depth <= 165, depth >= 155) %>% summarize(ubiomass = mean(ubiomass)) %>% pull(ubiomass)
PubDf <- PubDf %>% mutate(nbiomass = ubiomass/photicBiomass)
pWBS <- PubDf %>% 
  ggplot(aes(x = nbiomass, y = depth)) + geom_path() + scale_y_reverse() + scale_x_continuous(limits = c(0,1.2)) + geom_hline(yintercept = 160, color = "darkgreen") + geom_vline(xintercept = 1, color = "gray50") + geom_vline(xintercept = 0, color = "gray50") + geom_hline(yintercept = OMZBase, color = "darkblue") + labs( x = "<500 μm particle mass (norm.)")  + theme(axis.title.y = element_blank()) 
pWBS

#Large Particle Biomass

LubDf <- ToPlot %>% mutate(ubiomass = nparticles * lb ^ ag_global) %>% filter(lb >= 0.5) %>% group_by(time, depth) %>% summarize(ubiomass = sum(ubiomass)) %>% ungroup %>% group_by(depth)  %>% summarise(ubiomass = mean(ubiomass))
photicBiomass <- LubDf %>% filter(depth <= 165, depth >=155) %>% summarize(ubiomass = mean(ubiomass)) %>% pull(ubiomass)
LubDf <- LubDf %>% mutate(nbiomass = ubiomass/photicBiomass)
pWBL <- LubDf %>% ggplot(aes(x = nbiomass, y = depth)) + geom_path() + scale_y_reverse() + scale_x_continuous(limits = c(0,1)) + geom_hline(yintercept = 160, color = "darkgreen") + labs( x = ">500 particle mass (norm.)") + geom_vline(xintercept = 1, color = "gray50") + geom_vline(xintercept = 0, color = "gray50") + geom_hline(yintercept = OMZBase, color = "darkblue") + theme(axis.title.y = element_blank()) 
pWBL

Combine the three lower pannels

WBFig5 <- plot_grid(pWBPSD, pWBS,pWBL, nrow = 1, labels = c("B", "C", "D"))
Removed 6 row(s) containing missing values (geom_path).Removed 7 row(s) containing missing values (geom_path).
WBFig5

Four panel figure of Weber and Bianchi equivalent data

WBcombined <- plot_grid(WBColorMap + theme(plot.margin = unit(c(0,3,0, 3), "cm")), WBFig5, ncol = 1, labels = c("A", ""))
WBcombined


ggsave("figures/WBModelValidation.png")
Saving 8.5 x 6 in image

Figure S8

P16 Flux

Flux

scientific_10 <- function(x) {parse(text=gsub("e\\+*", " %*% 10^", scales::scientific_format()(x))) }
#https://stackoverflow.com/questions/10762287/how-can-i-format-axis-labels-with-exponents-with-ggplot2-and-scales
#jacob_magnitude <- function(x){expression(10^round(log10(x)))}

cb10 <- c('#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a')
pltFlxP16 <- bds %>% filter(project == "P16") %>% #filter(DFP > 1) %>% #filter(profile %in% c("stn_043", "p16n_100")) %>%
  ggplot(aes(y = depth, x = Flux_Smooth, group = factor(time)))  + geom_point(size = 3, stroke = 1)+
  geom_path() +
  scale_y_reverse(limits = c(1000, 0))+
  scale_x_log10(limits = c(35, 150),breaks = seq(from = 20, to = 150, by = 20)) +
   scale_color_gradient2(low = "darkgreen", mid = "gray80", high = "purple", midpoint = 10) + scale_shape_manual(name = "Day of Month", values = rep(21:25, 2)) + 
  scale_fill_gradientn(name = "Hour of Day", breaks = c(0, 6, 12, 18, 24), colors = c("black", "blue", "white", "orange", "black")) +
  
labs(x = bquote(Smoothed~Flux~(µmol~C/m^2/d)), y = "Depth (m)") +
  geom_hline(yintercept = 200, color = "darkgreen") +
  theme(axis.text.x = element_text(angle = 90, vjust = .3), legend.spacing = unit(.1, "cm"))
# 
# 
# 
# pltFlxNoLegend <- pltFlx + theme(legend.position = "none")
# pltFlxLegend <- get_legend(pltFlx)
# 
pltFlxP16

# #plotly::ggplotly(plt1)

Rate of change of flux – fifth root transformed

cb10 <- c('#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a')
pltDelta3P16 <- bds %>% filter(project == "P16") %>% #filter(DFP > 1) %>% #filter(profile %in% c("stn_043", "p16n_100")) %>%
  ggplot(aes(y = depth, x = pracma::nthroot(DF/DZ, 5), group = factor(time)))  + geom_point(size = 3, stroke = 1)+
  geom_path() +
  scale_y_reverse(limits = c(1000, 0))+
  scale_x_continuous(limits = c(-1, .1), breaks = seq(from = -2, to = .75, by = 0.5)) +
  #scale_x_log10() +
   scale_color_gradient2(low = "darkgreen", mid = "gray80", high = "purple", midpoint = 10) + scale_shape_manual(name = "Day of Month", values = rep(21:25, 2)) + 
  scale_fill_gradientn(name = "Hour", breaks = c(0, 6, 12, 18, 24), colors = c("black", "blue", "white", "orange", "black")) +
  geom_vline(xintercept = 0) +
  geom_hline(yintercept = 200, color = "darkgreen")+
  labs(x = bquote((DF/DZ)^{1/5}~(µmolC/m^3/d)^{1/5}), y = "Depth (m)") + theme(legend.pos = "none")
  #labs(x = "(DF/DZ) ^ 1/5 (µmol C/m^3/d) ^ 1/5")

pltDelta3P16

#plotly::ggplotly(plt1pos)

Difference from model

osms_p16 <- bds %>% filter(project == "P16") %>%
  ggplot(aes(y = depth, x = pracma::nthroot(ospsDZ, 3), group = factor(time))) + geom_point(size = 3) + geom_path() + scale_y_reverse(limits = c(1000, 0)) +
  scale_x_continuous(limits = c(-1, 1)) +
  geom_vline(xintercept = 0) +   scale_shape_manual(name = "Day of Month", values = rep(21:25, 2)) + labs(x = "Observed - Modeled Small Particle Flux \n µmol/m^3/day") +
  scale_fill_gradientn(name = "Hour of Day", breaks = c(0, 6, 12, 18, 24), colors = c("black", "blue", "white", "orange", "black")) + geom_hline(yintercept = PhoticBase, color = "darkgreen") 
plotly::ggplotly(osms_p16)

#ggsave("..figures/FluxSizeShift.svg"

Combine everything together

plot_grid(
  pltFlxP16,
  pltDelta3P16,
  osms_p16
)
Removed 28 rows containing missing values (geom_point).Removed 28 row(s) containing missing values (geom_path).Removed 32 rows containing missing values (geom_point).Removed 32 row(s) containing missing values (geom_path).Removed 29 rows containing missing values (geom_point).Removed 29 row(s) containing missing values (geom_path).

ggsave("figures/P16FluxRelate.svg")
Saving 8 x 8 in image
ggsave("figures/P16FluxRelate.png")
Saving 8 x 8 in image

Figure S10

Flux attenuation example

Take one profile, attenuate it, and show what it looks like

source("ModelStuff.R")
Parsed with column specification:
cols(
  Cruise = col_character(),
  Station = col_character(),
  `mon/dd/yyyy` = col_character(),
  `hh:mm` = col_time(format = ""),
  `Longitude [degrees east]` = col_double(),
  `Latitude [degrees north]` = col_double(),
  `Bottom Depth [m]` = col_double(),
  `Pressure [db]` = col_double(),
  `Temperature [degrees C]` = col_double(),
  `Temperature 2 [degrees C]` = col_double(),
  `Salinity [psu]` = col_double(),
  `Salinity 2 [psu]` = col_double(),
  `Fluorescense [mg/m^3]` = col_double(),
  `Beam Transmission [%]` = col_double(),
  PAR = col_double(),
  `Oxygen [umol/kg]` = col_double(),
  `Oxygen [% saturation]` = col_double()
)
scan_for_example <- bds %>% filter(project == "ETNP", depth < 500, depth > 200) %>% select(profile, depth, DFP, use_this_DFP, ospsDZ)

#loc_station = "stn_036"
loc_station = "stn_043"
loc_depth = 225
loc_prev_depth = 112.5

allDFPs <- bds %>% filter(profile == loc_station, depth >= loc_prev_depth, depth <= loc_depth) %>% summarize(DFP = prod(DFP), use_this_DFP = prod(use_this_DFP))

loc_DFP <-  allDFPs %>% pull(DFP)
loc_use_DFP <- allDFPs %>% pull(use_this_DFP)


for_single_disag <- bes %>% filter(profile == loc_station, depth %in% c(loc_prev_depth, loc_depth)) %>% select(depth, lb, nnp_smooth) %>%
  mutate(depth = recode(depth, `112.5` = "Shallow", `225` = "Deep")) %>% # I have no idea how to not hard code this bit
  pivot_wider(names_from = depth, values_from = nnp_smooth) 

with_disag <- for_single_disag %>%
  mutate(Predicted_Deep = remin_smooth_shuffle(Shallow, loc_use_DFP)) 
#remin_smooth_shuffle(for_single_disag$Shallow,loc_use_DFP)

for_plot_disag <- with_disag %>% pivot_longer(cols = -lb) %>% #filter(lb <= 5) %>%
  mutate(name = factor(name, levels = c("Shallow", "Deep", "Predicted_Deep"))) %>%
  mutate(name = recode_factor(name, Shallow = "Shallow (112.5m)", Deep = "Deep (225m)", Predicted_Deep = "Predicted Deep (225m)"))

for_plot_disag %>% ggplot(aes(x = lb, y = value, shape = name)) + geom_point() + scale_x_log10() + scale_y_log10() + scale_shape_manual(values = c(1, 6, 3)) + theme(legend.title = element_blank()) + labs(x = "Particle Size (mm)", y = "Normalized Particle Abundance (#/L/mm)")

ggsave("figures/DisagExample.png")
Saving 7.29 x 4.5 in image
ggsave("figures/DisagExample.svg")
Saving 7.29 x 4.5 in image

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgpGb3IgZ2VuZXJhdGluZyBtb3N0LCBidXQgbm90IGFsbCBmaWd1cmVzIGluIHRoZSBtYW51c2NyaXB0LgoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KG1nY3YpCnNvdXJjZSgiVVZQXzIwMTdfbGlicmFyeS5SIikKdGhlbWVfc2V0KHRoZW1lX2Nvd3Bsb3QoKSkKY2IxMCA8LSBjKCcjYTZjZWUzJywnIzFmNzhiNCcsJyNiMmRmOGEnLCcjMzNhMDJjJywnI2ZiOWE5OScsJyNlMzFhMWMnLCcjZmRiZjZmJywnI2ZmN2YwMCcsJyNjYWIyZDYnLCcjNmEzZDlhJykKYGBgCgoKIyBQYXJ0aWNsZXMgT25seQoKIyBSZWFkIEluIERhdGEKVGhlc2UgcmVhZCBiYWNrIGluIGluIFVUQywgc2luY2Ugd3JpdGVfY3N2IHNhdmVzIGV2ZXJ0aGluZyBpbnRvIHRoYXQgdGltZSB6b25lLgoKYGBge3J9Cm9wdGlvbnMocmVhZHIuZGVmYXVsdF9sb2NhbGU9cmVhZHI6OmxvY2FsZSh0ej0iTWV4aWNvL0dlbmVyYWwiKSkKYmVzPC0gcmVhZF9jc3YoImRhdGFPdXQvYmlubmVkX0VhY2hTaXplLmNzdiIpCmJkcyA8LSByZWFkX2NzdigiZGF0YU91dC9iaW5uZWRfRGVwdGhTdW1tYXJ5LmNzdiIpCnVlcyA8LSByZWFkX2NzdigiZGF0YU91dC91bmJpbm5lZF9FYWNoU2l6ZS5jc3YiKQp1ZHMgPC0gcmVhZF9jc3YoImRhdGFPdXQvdW5iaW5uZWRfRGVwdGhTdW1tYXJ5LmNzdiIpCmBgYAoKU3BlY2lmeSB0aGUgYmFzZSBvZiB0aGUgcGhvdGljIHpvbmUgKHdoaWNoIGlzIGluc2lkZSBvZiB0aGUgT01aKSBhbmQgdGhlIGJhZSBvZiB0aGUgT01aCmBgYHtyfQpQaG90aWNCYXNlIDwtIDE2MApPTVpCYXNlIDwtIDkwMApEVk1CYXNlIDwtIDYwMApPTVpUb3AgPC0gOTAKYGBgCgoKIyBGaWd1cmUgNAojIyBUb3RhbCBQYXJ0aWNsZSBudW1iZXJzIGFuZCBwYXJ0aWNsZSBzaXplIGRpc3RyaWJ1dGlvbiBzbG9wZQoKYGBge3IgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA3fQpsaWJyYXJ5KHNjYWxlcykKI2h0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMwMTc5NDQyL3Bsb3R0aW5nLW1pbm9yLWJyZWFrcy1vbi1hLWxvZy1zY2FsZS13aXRoLWdncGxvdApsb2dfYnJlYWtzID0gZnVuY3Rpb24obWFqLCByYWRpeD0xMCkgewogIGZ1bmN0aW9uKHgpIHsKICAgIG1pbnggICAgICAgICA9IGZsb29yKG1pbihsb2diKHgscmFkaXgpLCBuYS5ybT1UKSkgLSAxCiAgICBtYXh4ICAgICAgICAgPSBjZWlsaW5nKG1heChsb2diKHgscmFkaXgpLCBuYS5ybT1UKSkgKyAxCiAgICBuX21ham9yICAgICAgPSBtYXh4IC0gbWlueCArIDEKICAgIG1ham9yX2JyZWFrcyA9IHNlcShtaW54LCBtYXh4LCBieT0xKQogICAgaWYgKG1haikgewogICAgICBicmVha3MgPSBtYWpvcl9icmVha3MKICAgIH0gZWxzZSB7CiAgICAgIHN0ZXBzID0gbG9nYigxOihyYWRpeC0xKSxyYWRpeCkKICAgICAgYnJlYWtzID0gcmVwKHN0ZXBzLCB0aW1lcz1uX21ham9yKSArCiAgICAgICAgICAgICAgIHJlcChtYWpvcl9icmVha3MsIGVhY2g9cmFkaXgtMSkKICAgIH0KICAgIHJhZGl4XmJyZWFrcwogIH0KfQpzY2FsZV94X2xvZ19lbmcgPSBmdW5jdGlvbiguLi4sIHJhZGl4PTEwKSB7CiAgc2NhbGVfeF9jb250aW51b3VzKC4uLiwKICAgICAgICAgICAgICAgICAgICAgdHJhbnM9bG9nX3RyYW5zKHJhZGl4KSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWxvZ19icmVha3MoVFJVRSwgcmFkaXgpLAogICAgICAgICAgICAgICAgICAgICBtaW5vcl9icmVha3M9bG9nX2JyZWFrcyhGQUxTRSwgcmFkaXgpKQp9Cgp5YnJlYWtzID0gc2VxKGZyb20gPSAxMjAwLCB0byA9IDAsIGJ5ID0gLTUwKQp5bGFiZWxzID0geWJyZWFrcwp5bGFiZWxzW2MoRkFMU0UsIFRSVUUsIFRSVUUsIFRSVUUpXSA8LSAiIgoKI3RoZW1lX3NldCh0aGVtZV9idykKCgojdGhlbWVfc2V0KHRoZW1lX2Nvd3Bsb3QpCgpQbG90UGFydGljbGVzbWFueSA8LSB1ZHMgJT4lIAogIGZpbHRlcihwcm9qZWN0ID09ICJFVE5QIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdG90X25wYXJ0aWNsZXMsIHkgPSBkZXB0aCwgc2hhcGUgPSBmYWN0b3IoZGF5KHRpbWUpKSwgZmlsbCA9IGhvdXIodGltZSkpKSArCiAKICAjZ2VvbV9wYXRoKGFlcyh4ID0gcHNkX2dhbSkpICsgCiAgI2dlb21fcmliYm9uKGFlcyh4ID0gcHNkX2dhbSwgeG1pbiA9IHBzZF9nYW0gLSAyICogcHNkX3NlZywgeG1heCA9IHBzZF9nYW0gKyAyICogcHNkX3NlZyksIGFscGhhID0gMC4xLCBvdXRsaW5lX3R5cGUgPSAibG93ZXIiKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IC42LCBzaXplID0gMS41LCBzdHJva2UgPSAuNSkgKwogIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDEyMDAsIDApLAogICAgICAgICAgICAgICAgICBicmVha3MgPSB5YnJlYWtzLAogICAgICAgICAgICAgICAgICBsYWJlbHMgPSB5bGFiZWxzKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMjE6MjUpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oYnJlYWtzID0gYygwLCA2LCAxMiwgMTgsIDI0KSwgY29sb3JzID0gYygiYmxhY2siLCAiYmx1ZSIsICJ3aGl0ZSIsICJvcmFuZ2UiLCAiYmxhY2siKSwgbGltaXRzID0gYygwLCAyNCkpICsKICBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IGMoMTAsIDEwMCwgMTAwMCksIG1pbm9yID0gYyg1LCA1MCwgNTAwKSkgKwogICN0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAjc2NhbGVfeF9sb2dfZW5nKCkrCiAgbGFicyh5ID0gIkRlcHRoIChtKSIsIHggPSAiUGFydGljbGVzIC8gTCIpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gUGhvdGljQmFzZSwgY29sb3IgPSAiZGFya2dyZWVuIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWkJhc2UsIGNvbG9yID0gImRhcmtibHVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWlRvcCwgY29sb3IgPSAiZGFya2JsdWUiKSArCiAgI2dlb21faGxpbmUoeWludGVyY2VwdCA9IERWTUJhc2UsIGNvbG9yID0gImRhcmtnb2xkZW5yb2QiLCBsdHkgPSAiZGFzaGVkIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQoKUGxvdFBTRG1hbnkgPC0gdWRzICU+JSAKICBmaWx0ZXIocHJvamVjdCA9PSAiRVROUCIpICU+JQogIGdncGxvdChhZXMoeCA9IHBzZCwgeSA9IGRlcHRoLCBzaGFwZSA9IGZhY3RvcihkYXkodGltZSkpLCBmaWxsID0gaG91cih0aW1lKSkpICsKIAogICNnZW9tX3BhdGgoYWVzKHggPSBwc2RfZ2FtKSkgKyAKICAjZ2VvbV9yaWJib24oYWVzKHggPSBwc2RfZ2FtLCB4bWluID0gcHNkX2dhbSAtIDIgKiBwc2Rfc2VnLCB4bWF4ID0gcHNkX2dhbSArIDIgKiBwc2Rfc2VnKSwgYWxwaGEgPSAwLjEsIG91dGxpbmVfdHlwZSA9ICJsb3dlciIpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjYsIHNpemUgPSAxLjUsIHN0cm9rZSA9IC41KSArCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoMTIwMCwgMCksIGJyZWFrcyA9IHlicmVha3MsIGxhYmVscyA9IHlsYWJlbHMpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJEYXkiLCB2YWx1ZXMgPSBjKDIxOjI1KSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKG5hbWUgPSAiSG91ciIsYnJlYWtzID0gYygwLCA2LCAxMiwgMTgsIDI0KSwgbGFiZWxzID0gIGMoIjAiLCAiNiIsICIxMiIsICIxOCIsICIyNCIpLCBjb2xvcnMgPSBjKCJibGFjayIsICJibHVlIiwgIndoaXRlIiwgIm9yYW5nZSIsICJibGFjayIpLCBsaW1pdHMgPSBjKDAsIDI0KSkgKwogIGxhYnMoeSA9ICJEZXB0aCAobSkiLCB4ID0gIlBhcnRpY2xlIFNpemUgRGlzdHJpYnV0aW9uIFNsb3BlIikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBQaG90aWNCYXNlLCBjb2xvciA9ICJkYXJrZ3JlZW4iKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gT01aQmFzZSwgY29sb3IgPSAiZGFya2JsdWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gT01aVG9wLCBjb2xvciA9ICJkYXJrYmx1ZSIpICsKICAjZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gRFZNQmFzZSwgY29sb3IgPSAiZGFya2dvbGRlbnJvZCIsIGx0eSA9ICJkYXNoZWQiKSArCiAgY29vcmRfY2FydGVzaWFuKGNsaXAgPSAib2ZmIikgKwogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAtMiwgeSA9IDExMDAsIGxhYmVsID0gIlByb3BvcnRpb25hbGx5IFxuIGZld2VyIHNtYWxsIFxuIHBhcnRpY2xlcyIsIGluaGVyaXQuYWVzID0gRkFMU0UsIHNpemUgPSA2KSArCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IC00LjIsIHkgPSAxMTAwLCBsYWJlbCA9ICJQcm9wb3J0aW9uYWxseSBcbiBtb3JlIHNtYWxsIFxuIHBhcnRpY2xlcyIsIGluaGVyaXQuYWVzID0gRkFMU0UsIHNpemUgPSA2KSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCiAgIyBhbm5vdGF0aW9uX2N1c3RvbSgKICAjICAgICBncm9iID0gdGV4dEdyb2IobGFiZWwgPSAiTW9yZSBiaWcgcGFydGljbGVzIiwgaGp1c3QgPSAwLCBncCA9IGdwYXIoY2V4ID0gMTIpKSwKICAjICAgICB5bWluID0gMCwgICAgICAjIFZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSB0ZXh0R3JvYgogICMgICAgIHltYXggPSAwLAogICMgICAgIHhtaW4gPSAwLCAgICAgICAgICMgTm90ZTogVGhlIGdyb2JzIGFyZSBwb3NpdGlvbmVkIG91dHNpZGUgdGhlIHBsb3QgYXJlYQogICMgICAgIHhtYXggPSAwKQogIAoKcGxvdF9ncmlkKAogIFBsb3RQYXJ0aWNsZXNtYW55LAogIFBsb3RQU0RtYW55LAogIHJlbF93aWR0aHMgPSBjKDEsIDIpLAogIGxhYmVscyA9IGMoIkEiLCAiQiIpCiAgKQoKZ2dzYXZlKCJmaWd1cmVzL1BhcnRpY2xlc1BTRE1hbnkucG5nIikKZ2dzYXZlKCJmaWd1cmVzL1BhcnRpY2xlc1BTRE1hbnkuc3ZnIikKCmBgYAoKIyMgRmlndXJlIDMgU3VtbWFyeSBTdGF0aXN0aWNzCgojIyMgUGFydGljbGUgbnVtYmVyIHZzIGRlcHRoIGFuZCB0aW1lCgpgYGB7cn0KYmRzQWRkVGltZSA8LSBiZHMgJT4lCiAgbXV0YXRlKEhvdXIgPSBob3VyKHRpbWUpLCBEYXkgPSBkYXkodGltZSkpCgpGU0cxIDwtIGdhbSh0b3RfbnBhcnRpY2xlc34gcyhkZXB0aCwgayA9IDMpICsgcyhEYXksIGsgPSAzKSArIHMoSG91ciwgayA9IDQsIGJzID0gImNjIiksIGtub3RzID0gbGlzdChIb3VyID0gYygwLCAyNCkpLCBkYXRhID0gYmRzQWRkVGltZSAlPiUgZmlsdGVyKGRlcHRoID49IFBob3RpY0Jhc2UgJiBkZXB0aCA8PTUwMCAmIHByb2plY3QgPT0gIkVUTlAiKSkKCkZTRzIgPC0gZ2FtKHRvdF9ucGFydGljbGVzIH4gcyhkZXB0aCwgayA9IDMpICsgcyhEYXksIGsgPSAzKSwgZGF0YSA9IGJkc0FkZFRpbWUgJT4lIGZpbHRlcihkZXB0aCA+PSBQaG90aWNCYXNlICYgZGVwdGggPD01MDAgJiBwcm9qZWN0ID09ICJFVE5QIikpCgpGU0czIDwtIGdhbSh0b3RfbnBhcnRpY2xlcyB+IHMoZGVwdGgsIGsgPSAzKSwgZGF0YSA9IGJkc0FkZFRpbWUgJT4lIGZpbHRlcihkZXB0aCA+PSBQaG90aWNCYXNlICYgZGVwdGggPD01MDAgJiBwcm9qZWN0ID09ICJFVE5QIikpCgojRlNHNCA8LSBnYW0odG90X25wYXJ0aWNsZXN+IHMoZGVwdGgsIGsgPSAzKSAgKyBzKEhvdXIsIGsgPSA0LCBicyA9ICJjYyIpLCBrbm90cyA9IGxpc3QoSG91ciA9IGMoMCwgMjQpKSwgZGF0YSA9IGJkc0FkZFRpbWUgJT4lIGZpbHRlcihkZXB0aCA+PSBQaG90aWNCYXNlICYgZGVwdGggPD01MDAgJiBwcm9qZWN0ID09ICJFVE5QIikpCgpzdW1tYXJ5KEZTRzEpCnN1bW1hcnkoRlNHMikKc3VtbWFyeShGU0czKQojc3VtbWFyeShGU0c0KQoKc3VtbWFyeShGU0cxKSRyLnNxIC0gc3VtbWFyeShGU0cyKSRyLnNxICMgZXh0cmEgUl4yIGV4cGxhaW5lZCBieSBob3VyCnN1bW1hcnkoRlNHMikkci5zcSAtIHN1bW1hcnkoRlNHMykkci5zcSAjIGV4dHJhIGV4cGxhaW5lZCBieSBkYXkKc3VtbWFyeShGU0czKSRyLnNxICMgUl4yIGV4cGxhaW5lZCBieSBkZXB0aApgYGAKVGhlcmUgaXMgbm8gc3RhdGlzdGljbGx5IHNpZ25pZmljYW50IGFmZmVjdCBvZiB0aW1lIG9uIHBhcnRpY2xlIG51bWJlci4KSWYgSSB0YWtlIGFsbCBvZiB0aGUgdGltZSB2YXJpYWJsZXMgb3V0IGFuZCBqdXN0IGNvbXBhcmUgdG8gZGVwdGgsIHRoZXJlIGlzIGEgcmVsYXRpb25zaGlwIHRvIGRlcHRoIHAgPSAwLjAyLiBCdXQgdGhlIFJeMiBpcyBvbmx5IDYuNSUuIFByZXR0eSB3ZWFrCgoKIyMjIFBhcnRpY2xlIHNpemUgZGlzdHJpYnV0aW9uIHZzIGRlcHRoIGFuZCB0aW1lCgoKCmBgYHtyfQpiZHNBZGRUaW1lIDwtIGJkcyAlPiUKICBtdXRhdGUoSG91ciA9IGhvdXIodGltZSksIERheSA9IGRheSh0aW1lKSkKCkZTRzEgPC0gZ2FtKHBzZH4gcyhkZXB0aCwgayA9IDMpICsgcyhEYXksIGsgPSAzKSArIHMoSG91ciwgayA9IDQsIGJzID0gImNjIiksIGtub3RzID0gbGlzdChIb3VyID0gYygwLCAyNCkpLCBkYXRhID0gYmRzQWRkVGltZSAlPiUgZmlsdGVyKGRlcHRoID49IFBob3RpY0Jhc2UgJiBkZXB0aCA8PTUwMCAmIHByb2plY3QgPT0gIkVUTlAiKSkKCkZTRzIgPC0gZ2FtKHBzZCB+IHMoZGVwdGgsIGsgPSAzKSArIHMoRGF5LCBrID0gMyksIGRhdGEgPSBiZHNBZGRUaW1lICU+JSBmaWx0ZXIoZGVwdGggPj0gUGhvdGljQmFzZSAmIGRlcHRoIDw9NTAwICYgcHJvamVjdCA9PSAiRVROUCIpKQoKRlNHMyA8LSBnYW0ocHNkIH4gcyhkZXB0aCwgayA9IDMpLCBkYXRhID0gYmRzQWRkVGltZSAlPiUgZmlsdGVyKGRlcHRoID49IFBob3RpY0Jhc2UgJiBkZXB0aCA8PTUwMCAmIHByb2plY3QgPT0gIkVUTlAiKSkKCkZTRzQgPC0gZ2FtKHBzZH4gcyhkZXB0aCwgayA9IDMpICArIHMoSG91ciwgayA9IDQsIGJzID0gImNjIiksIGtub3RzID0gbGlzdChIb3VyID0gYygwLCAyNCkpLCBkYXRhID0gYmRzQWRkVGltZSAlPiUgZmlsdGVyKGRlcHRoID49IFBob3RpY0Jhc2UgJiBkZXB0aCA8PTUwMCAmIHByb2plY3QgPT0gIkVUTlAiKSkKCnN1bW1hcnkoRlNHMSkKI3N1bW1hcnkoRlNHMikKI3N1bW1hcnkoRlNHMykKc3VtbWFyeShGU0c0KQoKc3VtbWFyeShGU0czKSRyLnNxICMgUl4yIG9mIGRlcHRoCnN1bW1hcnkoRlNHNCkkci5zcSAtIHN1bW1hcnkoRlNHMykkci5zcSAjIEltcHJvdmVtZW50IGZyb20gYWRkaW5nIGhvdXIgb2YgdGhlIGRheQpzdW1tYXJ5KEZTRzEpJHIuc3EgLSBzdW1tYXJ5KEZTRzQpJHIuc3EgIyBJbXByb3ZlbWVudCBmcm9tIHRoZW4gYWRkaW5nIGRheSBvZiB0aGUgd2VlawoKYGBgClBTRCB2YXJpZXMgd2l0aCBkZXB0aCwgYnV0IGRvZXNuJ3Qgc3RhdGlzdGljYWxseSByZWxhdGUgdG8gaG9yIG9yZGF5LgpDb21wYXJpbmcgdGhlIFIyIHZhbHVlcyBmcm9tIG1vZGVscyB0ZWxscyB1cyB0aGF0IHlvdSBleHBsYWluIDY5JSBvZiB2YXJpZW5jZSB3aXRoIGRlcHRoLgoKIyBGaWd1cmUgUzYKIyMgQ29tcGFyaW5nIHRoZSB0d28gc3RhdGlvbnMKCiMjIyBTNkEgTnVtYmVyIHZzIGRlcHRoCmBgYHtyfQpQbG90TlBhcnRpY2xlc0VQIDwtIHVkcyAlPiUgCiAgZmlsdGVyKHByb2ZpbGUgJWluJSBjKCJzdG5fMDQzIiwgInAxNm5fMTAwIikpICU+JQogIGdncGxvdChhZXMoeCA9IHRvdF9ucGFydGljbGVzLCB5ID0gZGVwdGgsIGNvbCA9IHByb2plY3QsIHNoYXBlID0gcHJvamVjdCkpICsKIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcsIHNpemUgPSAyLCBzdHJva2UgPSAxKSArCiAgI2dlb21fcGF0aChhZXMoeCA9IHRvdF9ucGFydGljbGVzKSkgKwogICNnZW9tX3JpYmJvbihhZXMoeCA9IHBzZF9nYW0sIHhtaW4gPSBwc2RfZ2FtIC0gMiAqIHBzZF9zZWcsIHhtYXggPSBwc2RfZ2FtICsgMiAqIHBzZF9zZWcpLCBhbHBoYSA9IDAuMSkgKwpzY2FsZV95X3JldmVyc2UobGltaXRzID0gYygxMDAwLCAwKSkgKyBzY2FsZV94X2xvZzEwKCkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZ3JheTIwIiwgImJyb3duIikpICsKICBsYWJzKHggPSAiUGFydGljbGVzL0wiLCB5ID0gIkRlcHRoIChtKSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxOjUpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gUGhvdGljQmFzZSwgY29sb3IgPSAiZGFya2dyZWVuIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIwMCwgY29sb3IgPSAiZGFya2dyZWVuIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWkJhc2UsIGNvbG9yID0gImRhcmtibHVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWlRvcCwgY29sb3IgPSAiZGFya2JsdWUiKQoKUGxvdE5QYXJ0aWNsZXNFUApgYGAKCkkgcmVtb3ZlZCBvbmUgb3V0bHllciBmcm9tIHAxNiBmb3IgdmlzdWFsaXphdGlvbiBwdXJwb3NlcyAoMzAwIHBhcnRpY2xlcy9sIGF0IHN1cmZhY2UpCgojIyMgUzZCIFBhcnRpY2xlIHNpemUgZGlzdHJpYnV0aW9uIHZzIGRlcHRoCmBgYHtyfQpQbG90UFNERVAgPC0gdWRzICU+JSAKICBmaWx0ZXIocHJvZmlsZSAlaW4lIGMoInN0bl8wNDMiLCAicDE2bl8xMDAiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHNkLCB5ID0gZGVwdGgsIGNvbCA9IHByb2plY3QsIHNoYXBlID0gcHJvamVjdCkpICsKIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcsIHNpemUgPSAyLCBzdHJva2UgPSAxKSArCiAgZ2VvbV9wYXRoKGFlcyh4ID0gcHNkX2dhbSkpICsKICBnZW9tX3JpYmJvbihhZXMoeCA9IHBzZF9nYW0sIHhtaW4gPSBwc2RfZ2FtIC0gMiAqIHBzZF9zZWcsIHhtYXggPSBwc2RfZ2FtICsgMiAqIHBzZF9zZWcpLCBhbHBoYSA9IDAuMSkgKwpzY2FsZV95X3JldmVyc2UobGltaXRzID0gYygxMDAwLCAwKSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZ3JheTIwIiwgImJyb3duIikpICArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTo1KSkgKyBsYWJzKHkgPSAiIiwgeCA9ICJQYXJ0aWNsZSBTaXplIERpc3RyaWJ1dGlvbiBTbG9wZSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBQaG90aWNCYXNlLCBjb2xvciA9ICJkYXJrZ3JlZW4iKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjAwLCBjb2xvciA9ICJkYXJrZ3JlZW4iKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gT01aQmFzZSwgY29sb3IgPSAiZGFya2JsdWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gT01aVG9wLCBjb2xvciA9ICJkYXJrYmx1ZSIpCgpQbG90UFNERVAKYGBgCgojIyMgRmlndXJlIFM2IENvbWJpbmVkCgpgYGB7ciBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDR9CnBsb3RfZ3JpZChQbG90TlBhcnRpY2xlc0VQLCBQbG90UFNERVAsIHJlbF93aWR0aHMgPSBjKDIsMyksIGxhYmVscyA9IGMoIkEiLCAiQiIpKQpnZ3NhdmUoImZpZ3VyZXMvUGFydGljbGVzQW5kUFNEX0VUTlBWc1AxNi5zdmciKQpnZ3NhdmUoImZpZ3VyZXMvUGFydGljbGVzQW5kUFNEX0VUTlBWc1AxNi5wbmciKQpgYGAKCiMgRmlndXJlIFM3CgpMYXJnZSBhbmQgc3BhbGwgcGFydGljbGUgbnVtYmVyLCBmbHV4IGFuZCBzaXplCgpgYGB7cn0KbWFpblBhcnRpY2xlQ29tcG9uZW50cyA8LSBiZHMgJT4lCiAgZmlsdGVyKHByb2ZpbGUgJWluJSBjKCJzdG5fMDQzIiwgInAxNm5fMTAwIikpICU+JQogIHNlbGVjdChwcm9qZWN0LCBwcm9maWxlLCBkZXB0aCwKICAgICAgICAgdG90X25wYXJ0aWNsZXMsIHNtYWxsX25wYXJ0aWNsZXMsIGJpZ19ucGFydGljbGVzLAogICAgICAgICB0b3RfcHNkID0gcHNkLCBzbWFsbF9wc2QsIGJpZ19wc2QsCiAgICAgICAgIHRvdF9mbHV4X2ZpdCwgc21hbGxfZmx1eF9maXQsIGJpZ19mbHV4X2ZpdCkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtYygicHJvamVjdCIsICJwcm9maWxlIiwgImRlcHRoIikpICU+JQogIHNlcGFyYXRlKG5hbWUsIGMoInNpemUiLCAibWVhcyIpKSAlPiUKICBtdXRhdGUobWVhcyA9IHJlY29kZShtZWFzLCBucGFydGljbGVzID0gInBhcnRpY2xlcy9MIikpICU+JQogIG11dGF0ZShtZWFzID0gZmFjdG9yKG1lYXMsIGxldmVscyA9IGMoInBhcnRpY2xlcy9MIiwgImZsdXgiLCAicHNkIikpKSAlPiUKICBtdXRhdGUoc2l6ZSA9IGZhY3RvcihzaXplLCBsZXZlbHMgPSBjKCJzbWFsbCIsICJiaWciLCAidG90IikpKSAlPiUKICBtdXRhdGUoc2l6ZSA9IHJlY29kZShzaXplLCBzbWFsbCA9ICJtaWNyby1cbmFnZ3JlZ2F0ZXMgXG4gPCA1MDAgzrxtIiwgYmlnID0gIm1hcmluZVxuc25vdyBcbiA+IDUwMCDOvG0iLCB0b3QgPSAidG90YWwiKSkgJT4lCiAgcGFzcygpCgpQbG90Rmx4IDwtIG1haW5QYXJ0aWNsZUNvbXBvbmVudHMgJT4lIAogIGZpbHRlcihtZWFzICE9ICJwc2QiKSAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBkZXB0aCwgeCA9IHZhbHVlLCBjb2wgPSBwcm9qZWN0LCBzaGFwZSA9IHByb2plY3QpKSArIGZhY2V0X2dyaWQoc2l6ZSB+IG1lYXMsIHNjYWxlcyA9ICJmcmVlX3giKSArIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoMTAwMCwgMCkpICsgc2NhbGVfeF9sb2cxMCgpICsgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIHN0cmlwLmJhY2tncm91bmQueSA9IGVsZW1lbnRfYmxhbmsoKSwgc3RyaXAudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCBwbG90Lm1hcmdpbiA9IHVuaXQoYyg3LDAsNyw3KSwgInB0IikpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoUDE2ID0gImJyb3duIiwgRVROUCA9ICJncmF5MjAiKSkgKyBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxOjUpKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IFBob3RpY0Jhc2UsIGNvbG9yID0gImRhcmtncmVlbiIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMDAsIGNvbG9yID0gImRhcmtncmVlbiIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBPTVpCYXNlLCBjb2xvciA9ICJkYXJrYmx1ZSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBPTVpUb3AsIGNvbG9yID0gImRhcmtibHVlIikKClBsb3RQU0QgPC0gbWFpblBhcnRpY2xlQ29tcG9uZW50cyAlPiUgCiAgZmlsdGVyKG1lYXMgPT0gInBzZCIpICU+JQogIGdncGxvdChhZXMoeSA9IGRlcHRoLCB4ID0gdmFsdWUsIGNvbCA9IHByb2plY3QsIHNoYXBlID0gcHJvamVjdCkpICsgZmFjZXRfZ3JpZChzaXplfm1lYXMsIHNjYWxlcyA9ICJmcmVlX3giKSArIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoMTAwMCwgMCkpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lLnkgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksIHBsb3QubWFyZ2luID0gdW5pdChjKDcsNywyNi41LDApLCAicHQiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKFAxNiA9ICJicm93biIsIEVUTlAgPSAiZ3JheTIwIikpICsgIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE6NSkpICsgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IFBob3RpY0Jhc2UsIGNvbG9yID0gImRhcmtncmVlbiIpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IFBob3RpY0Jhc2UsIGNvbG9yID0gImRhcmtncmVlbiIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMDAsIGNvbG9yID0gImRhcmtncmVlbiIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBPTVpCYXNlLCBjb2xvciA9ICJkYXJrYmx1ZSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBPTVpUb3AsIGNvbG9yID0gImRhcmtibHVlIikKCnBsb3RfZ3JpZChQbG90Rmx4LCBQbG90UFNELCByZWxfd2lkdGhzID0gYyg3LCA1KSkKCmdnc2F2ZSgiZmlndXJlcy9CaWdWc1NtYWxsLnN2ZyIpCmdnc2F2ZSgiZmlndXJlcy9CaWdWc1NtYWxsLnBuZyIpCmBgYAoKRmx1eCBzbWFsbCBhbmQgZmx1eCB0b3QgdHJhY2sgc28gY2xvc2VseSBiZWNhdXNlIHBhcnRpY2xlIGZyYWN0YWwgZGltZW5zaW9uIGFscGhhLCBwbHVzIGZsdXggZnJhY3RhbCBkaW1lbnNpb24sIGdhbW1hID4gfHBzZHwuIHNpbmNlIHRoZSBzaXplIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZmx1eCBzb3VsZCBiZSBQU0QgKyBhZyAocHNkIGlzIG5lZ2F0aXZlIGluIHRoaXMgY2FzZSkuIFlvIHVjYW4gc2VlIHRoZSB2YXJpYW5jZSBhdCB0aGUgb25lIGRlcHRoIHdoZXJlIHBzZCBpcyBmbGF0ZXN0IGF0IHRoZSB2ZXJ5IHRvcC4KCgojIEZpZ3VyZSBTNApFeGFtcGxlIHBhcnRpY2xlIHNpemUgZGlzdHJpYnV0aW9ucwoKYGBge3J9CmVnX2RhdGFsaW5lIDwtIGJkcyAlPiUgCiAgZmlsdGVyKHByb2ZpbGUgPT0gInN0bl8wNDMiLCBkZXB0aCA9PSAxNjIuNSkKZWdfc2xvcGUgPSAgZWdfZGF0YWxpbmUgJT4lIHB1bGwocHNkKQplZ19pY3AgPSBlZ19kYXRhbGluZSAlPiUgcHVsbChpY3ApCmVnX3ZvbCA9IGVnX2RhdGFsaW5lICU+JSBwdWxsKHZvbCkKCmVnX2RhdGFibG9jayA8LSBiZXMgJT4lCiAgZmlsdGVyKHByb2ZpbGUgPT0gInN0bl8wNDMiLCBkZXB0aCA9PSAxNjIuNSkKCgplZ19sYiA9IGVnX2RhdGFibG9jayRsYgplZ19iaW5zaXplID0gZWdfZGF0YWJsb2NrJGJpbnNpemUKZWdfbm5wID0gZXhwKGVnX2ljcCArIGxvZyhlZ19sYikgKiBlZ19zbG9wZSkKCmVnX25wID0gZWdfbm5wICogZWdfYmluc2l6ZQplZ190cCA9IGVnX25wICogZWdfdm9sCmVnX2RmIDwtIHRpYmJsZShsYiA9IGVnX2xiLCBuX25wYXJ0aWNsZXMgPSBlZ19ubnAsIG5wYXJ0aWNsZXMgPSBlZ19ucCwgVG90YWxQYXJ0aWNsZXMgPSBlZ190cCkKCgpFZ05OUCA8LSBlZ19kYXRhYmxvY2sgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbGIsIHkgPSBuX25wYXJ0aWNsZXMpKSArIGdlb21fcG9pbnQoKSArIHNjYWxlX3hfbG9nMTAoKSArIHNjYWxlX3lfbG9nMTAoKSArIAogIGdlb21fcGF0aChkYXRhID0gZWdfZGYpICsgbGFicyh5ID0gIkJpbnNpemUgJiBWb2x1bWUgTm9ybWFsaXplZCBcbiBQYXJ0aWNsZXMgKCMvTC9tbSkiLCB4ID0gIlNpemUgKG1tKSIpCgpFZ05QIDwtIGVnX2RhdGFibG9jayAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsYiwgeSA9IG5wYXJ0aWNsZXMpKSArIGdlb21fcG9pbnQoKSArIHNjYWxlX3hfbG9nMTAoKSArIHNjYWxlX3lfbG9nMTAoKSArIAogIGdlb21fcGF0aChkYXRhID0gZWdfZGYpICsgbGFicyh5ID0gIk5vcm1hbGl6ZWQgUGFydGljbGVzIiAsIHggPSAiU2l6ZSAobW0pIikKCkVnVFAgPC0gZWdfZGF0YWJsb2NrICU+JQogIGdncGxvdChhZXMoeCA9IGxiLCB5ID0gVG90YWxQYXJ0aWNsZXMpKSArIGdlb21fcG9pbnQoKSArIHNjYWxlX3hfbG9nMTAoKSArIHNjYWxlX3lfbG9nMTAoKSArIAogIGdlb21fcGF0aChkYXRhID0gZWdfZGYpICsgbGFicyggeSA9ICJUb3RhbCBQYXJ0aWNsZXMgT2JzZXJ2ZWQgKCMpIiwgeCA9ICJTaXplIChtbSkiKQoKcGxvdF9ncmlkKEVnTk5QLCBFZ1RQLCBsYWJlbHMgPSBjKCJBIiwgIkIiKSkKZ2dzYXZlKCJmaWd1cmVzL0V4YW1wbGVQU0QxNjNtLnBuZyIpCmdnc2F2ZSgiZmlndXJlcy9FeGFtcGxlUFNEMTYzbS5zdmciKQoKYGBgCgojIEZpZ3VyZSA1QQpGbHV4IGF0dGVudWF0aW9uIHdpdGggcmVzcGVjdCBvdCBkZXB0aCBhbmQgdGltZS4gQWxsIGV4dHJhcG9sYXRlZCBmcm9tIHRoZSBVVlAgYW5kIHRyYXBzIGNvbWJpbmVkLgoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NH0Kc2NpZW50aWZpY18xMCA8LSBmdW5jdGlvbih4KSB7cGFyc2UodGV4dD1nc3ViKCJlXFwrKiIsICIgJSolIDEwXiIsIHNjYWxlczo6c2NpZW50aWZpY19mb3JtYXQoKSh4KSkpIH0Kc2NpZW50aWZpY18xMF9iIDwtIGZ1bmN0aW9uKHgpIHtwYXJzZSh0ZXh0PWdzdWIoImVcXCsqIiwgIiAlKiUgMTBeIiwgc2NhbGVzOjpzY2llbnRpZmljX2Zvcm1hdCgpKHgpKSkgfQoKc2NpZW50aWZpY18xMF9jIDwtIGZ1bmN0aW9uKHgpIHsKICAgIHhvdXQgPC0gZ3N1YigiMWUiLCAiMTBeeyIsIGZvcm1hdCh4KSxmaXhlZD1UUlVFKQogICAgeG91dCA8LSBnc3ViKCJ7LTAiLCAiey0iLCB4b3V0LGZpeGVkPVRSVUUpCiAgICB4b3V0IDwtIGdzdWIoInsrIiwgInsiLCB4b3V0LGZpeGVkPVRSVUUpCiAgICB4b3V0IDwtIGdzdWIoInswIiwgInsiLCB4b3V0LGZpeGVkPVRSVUUpCiAgICB4b3V0IDwtIHBhc3RlKHhvdXQsIn0iLHNlcD0iIikKICAgIHJldHVybihwYXJzZSh0ZXh0PXhvdXQpKQogICAgCn0KCnNjYWxlX3hfbG9nMTBuaWNlIDwtIGZ1bmN0aW9uKG5hbWU9TlVMTCxvbWFnPXNlcSgtMTAsMjApLC4uLikgewogICAgYnJlYWtzMTAgPC0gMTBeb21hZwogICAgc2NhbGVfeF9sb2cxMChicmVha3M9YnJlYWtzMTAsbGFiZWxzPXNjaWVudGlmaWNfMTBfYyhicmVha3MxMCksLi4uKQp9CgoKI2h0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNzYyMjg3L2hvdy1jYW4taS1mb3JtYXQtYXhpcy1sYWJlbHMtd2l0aC1leHBvbmVudHMtd2l0aC1nZ3Bsb3QyLWFuZC1zY2FsZXMKI2phY29iX21hZ25pdHVkZSA8LSBmdW5jdGlvbih4KXtleHByZXNzaW9uKDEwXnJvdW5kKGxvZzEwKHgpKSl9CgpjYjEwIDwtIGMoJyNhNmNlZTMnLCcjMWY3OGI0JywnI2IyZGY4YScsJyMzM2EwMmMnLCcjZmI5YTk5JywnI2UzMWExYycsJyNmZGJmNmYnLCcjZmY3ZjAwJywnI2NhYjJkNicsJyM2YTNkOWEnKQpwbHRGbHggPC0gYmRzICU+JSBmaWx0ZXIocHJvamVjdCA9PSAiRVROUCIpICU+JSAjZmlsdGVyKERGUCA+IDEpICU+JSAjZmlsdGVyKHByb2ZpbGUgJWluJSBjKCJzdG5fMDQzIiwgInAxNm5fMTAwIikpICU+JQogIGdncGxvdChhZXMoeSA9IGRlcHRoLCB4ID0gRmx1eF9TbW9vdGgsIHNoYXBlID0gZmFjdG9yKGRheSh0aW1lKSksIGZpbGwgPSBob3VyKHRpbWUpLCBncm91cCA9IGZhY3Rvcih0aW1lKSkpICArIGdlb21fcG9pbnQoc2l6ZSA9IDIsIHN0cm9rZSA9IDEpKwogICNnZW9tX3BhdGgoKSArCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoMTAwMCwgMCksIGJyZWFrcyA9IHlicmVha3MsIGxhYmVscyA9IHlsYWJlbHMpICsKICBzY2FsZV94X2xvZzEwbmljZSgpKwogICNzY2FsZV94X2xvZzEwKCkgKyAKICAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAiZ3JheTgwIiwgaGlnaCA9ICJwdXJwbGUiLCBtaWRwb2ludCA9IDEwKSArIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkRheSBvZiBNb250aCIsIHZhbHVlcyA9IHJlcCgyMToyNSwgMikpICsgCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4obmFtZSA9ICJIb3VyIG9mIERheSIsIGJyZWFrcyA9IGMoMCwgNiwgMTIsIDE4LCAyNCksIGNvbG9ycyA9IGMoImJsYWNrIiwgImJsdWUiLCAid2hpdGUiLCAib3JhbmdlIiwgImJsYWNrIiksIGxpbWl0cyA9IGMoMCwgMjQpKSArCiAgCiAgbGFicyh4ID0gYnF1b3RlKFNtb290aGVkfkZsdXh+KMK1bW9sfkMvbV4yL2QpKSwgeSA9ICJEZXB0aCAobSkiKSArCiAgI2xhYnMoeCA9ICJtb28iLCB5ID0gIkRlcHRoIChtKSIpICsKICBnZW9tX3JlY3QoZGF0YSA9IGRhdGEuZnJhbWUocHJvamVjdCA9ICJFVE5QIiksIGFlcyh4bWluID0gMjAsIHhtYXggPSAxODAsIHltaW4gPSA3NSwgeW1heCA9IDUwMCksIGNvbG91ciA9ICJyZWQiLCBmaWxsID0gTkEsIGluaGVyaXQuYWVzID0gRkFMU0UpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IC4zKSwgbGVnZW5kLnNwYWNpbmcgPSB1bml0KC4xLCAiY20iKSkgKwogICBnZW9tX3NlZ21lbnQoYWVzKHkgPSBQaG90aWNCYXNlLCB5ZW5kID0gUGhvdGljQmFzZSwgeCA9IDIwLCB4ZW5kID0gNTAwKSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc3Ryb2tlID0gMC41KSsKICAgZ2VvbV9zZWdtZW50KGFlcyh5ID0gT01aQmFzZSwgeWVuZCA9IE9NWkJhc2UsIHggPSAyMCwgeGVuZCA9IDUwMCksIGNvbG9yID0gImRhcmtibHVlIiwgc3Ryb2tlID0gMC41KSArCiAgIGdlb21fc2VnbWVudChhZXMoeSA9IE9NWlRvcCwgeWVuZCA9IE9NWlRvcCwgeCA9IDIwLCB4ZW5kID0gNTAwKSwgY29sb3IgPSAiZGFya2JsdWUiLCBzdHJva2UgPSAwLjUpCiAgI2dlb21fc2VnbWVudChhZXMoeSA9IERWTUJhc2UsIHllbmQgPSBEVk1CYXNlLCB4ID0gMjAsIHhlbmQgPSA1MDApLCBjb2xvciA9ICJkYXJrZ29sZGVucm9kIiwgbHR5ID0gImRhc2hlZCIsIHN0cm9rZSA9IDAuNSkKICAKICAjKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBPTVpCYXNlLCBjb2xvciA9ICJkYXJrYmx1ZSIpCgoKCnBsdEZseE5vTGVnZW5kIDwtIHBsdEZseCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKcGx0Rmx4TGVnZW5kIDwtIGdldF9sZWdlbmQocGx0Rmx4KQoKcGx0Rmx4CiNwbG90bHk6OmdncGxvdGx5KHBsdDEpCmBgYAoKIyMgRmlndXJlIDVCClpvb21pbmcgaW4gb24gd2hlcmUgdGhlIGFjdGlvbiBpcyBoYXBwZW5pbmcKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NH0KeWxhYmVsc19maW5lIDwtIHlicmVha3MKeWxhYmVsc19maW5lW2MoRkFMU0UsIFRSVUUpXSA8LSAiIgojeGJyZWFrc19maW5lIDwtIGMoc2VxKGZyb20gPSAyMCwgdG8gPSA1MCwgYnkgPSAxMCksIHNlcShmcm9tID0gNjAsIHRvID0gMTgwLCBieSA9IDIwKSkKeGJyZWFrc19maW5lIDwtIHNlcShmcm9tID0gMjAsIHRvID0gMTgwLCBieSA9IDEwKQp4bGFiZWxzX2ZpbmUgPC0geGJyZWFrc19maW5lCnRvc3MgPC0gYyhyZXAoRkFMU0UsIDUpLCByZXAoYyhUUlVFLCBGQUxTRSksIDYpKQp4bGFiZWxzX2ZpbmVbdG9zc10gPC0gIiIKeGxhYmVsc19maW5lW3hsYWJlbHNfZmluZSAlaW4lIGMoMTIwLCAxNjApXSA8LSAiIgoKI2xlbnggPC0gbGVuZ3RoKHhsYWJlbHNfZmluZSkKI3hsYWJlbHNfZmluZVtjKGxlbngsIGxlbngtMildIDwtICIiCmNiMTAgPC0gYygnI2E2Y2VlMycsJyMxZjc4YjQnLCcjYjJkZjhhJywnIzMzYTAyYycsJyNmYjlhOTknLCcjZTMxYTFjJywnI2ZkYmY2ZicsJyNmZjdmMDAnLCcjY2FiMmQ2JywnIzZhM2Q5YScpCnBsdEZseFpvb20gPC0gYmRzICU+JSBmaWx0ZXIocHJvamVjdCA9PSAiRVROUCIgJiBkZXB0aCA8PSA1MDAgJiBkZXB0aCA+PSA3NSkgJT4lICNmaWx0ZXIocHJvZmlsZSAlaW4lIGMoInN0bl8wNDMiLCAicDE2bl8xMDAiKSkgJT4lCiAgZ2dwbG90KGFlcyh5ID0gZGVwdGgsIHggPSBGbHV4X1Ntb290aCwgc2hhcGUgPSBmYWN0b3IoZGF5KHRpbWUpKSwgZmlsbCA9IGhvdXIodGltZSksIGdyb3VwID0gZmFjdG9yKHRpbWUpKSkgKyBnZW9tX3BvaW50KHNpemUgPSAyLCBzdHJva2UgPSAxKSsKICAjZ2VvbV9wYXRoKCkgKwogIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDUwMCwgNzUpLCBicmVha3MgPSB5YnJlYWtzLCBsYWJlbHMgPSB5bGFiZWxzX2ZpbmUpICsKICAjc2NhbGVfeF9sb2cxMCgpICsKICBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IHhicmVha3NfZmluZSwKICAgICAgICAgICAgICAgIGxhYmVscyA9IHhsYWJlbHNfZmluZSwKICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMjAsIDE4MCkpICsKICAgc2NhbGVfY29sb3JfZ3JhZGllbnQyKGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAiZ3JheTgwIiwgaGlnaCA9ICJwdXJwbGUiLCBtaWRwb2ludCA9IDEwKSArIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGJyZWFrcyA9IGMoMCwgNiwgMTIsIDE4LCAyNCksIGNvbG9ycyA9IGMoImJsYWNrIiwgImJsdWUiLCAid2hpdGUiLCAib3JhbmdlIiwgImJsYWNrIikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKwpsYWJzKHggPSAiU21vb3RoZWQgRmx1eCIsIHkgPSAiRGVwdGgiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrCmdlb21faGxpbmUoeWludGVyY2VwdCA9IFBob3RpY0Jhc2UsIGNvbG9yID0gImRhcmtncmVlbiIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBPTVpUb3AsIGNvbG9yID0gImRhcmtibHVlIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gLjUpKQoKcGx0Rmx4Wm9vbQojcGxvdGx5OjpnZ3Bsb3RseShwbHQxKQpgYGAKCiMjIEZpZ3VyZSA1QwpSYXRlIG9mIGNoYW5nZSBvZiBmbHV4LCB0YWtlbiB0byB0aGUgZmlmdGggcm9vdCBzbyBvbmUgY2FuIHNlZSBwYXR0ZXJucy4KCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTR9CmNiMTAgPC0gYygnI2E2Y2VlMycsJyMxZjc4YjQnLCcjYjJkZjhhJywnIzMzYTAyYycsJyNmYjlhOTknLCcjZTMxYTFjJywnI2ZkYmY2ZicsJyNmZjdmMDAnLCcjY2FiMmQ2JywnIzZhM2Q5YScpCnBsdERlbHRhMyA8LSBiZHMgJT4lIGZpbHRlcihwcm9qZWN0ID09ICJFVE5QIikgJT4lICNmaWx0ZXIoREZQID4gMSkgJT4lICNmaWx0ZXIocHJvZmlsZSAlaW4lIGMoInN0bl8wNDMiLCAicDE2bl8xMDAiKSkgJT4lCiAgZ2dwbG90KGFlcyh5ID0gZGVwdGgsIHggPSBwcmFjbWE6Om50aHJvb3QoREYvRFosIDUpLCBzaGFwZSA9IGZhY3RvcihkYXkodGltZSkpLCBmaWxsID0gaG91cih0aW1lKSwgZ3JvdXAgPSBmYWN0b3IodGltZSkpKSAgKyBnZW9tX3BvaW50KHNpemUgPSAyLCBzdHJva2UgPSAxKSsKICAjZ2VvbV9wYXRoKCkgKwogIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDEwMDAsIDApLCBicmVha3MgPSB5YnJlYWtzLCBsYWJlbHMgPSB5bGFiZWxzKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTIuMSwgLjYpLCBicmVha3MgPSBzZXEoZnJvbSA9IC0yLCB0byA9IC43NSwgYnkgPSAwLjUpKSArCiAgI3NjYWxlX3hfbG9nMTAoKSArCiAgIHNjYWxlX2NvbG9yX2dyYWRpZW50Mihsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gImdyYXk4MCIsIGhpZ2ggPSAicHVycGxlIiwgbWlkcG9pbnQgPSAxMCkgKyBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJEYXkgb2YgTW9udGgiLCB2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKG5hbWUgPSAiSG91ciIsIGJyZWFrcyA9IGMoMCwgNiwgMTIsIDE4LCAyNCksIGNvbG9ycyA9IGMoImJsYWNrIiwgImJsdWUiLCAid2hpdGUiLCAib3JhbmdlIiwgImJsYWNrIikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgbGFicyh4ID0gYnF1b3RlKChERi9EWileezEvNX1+KMK1bW9sfkMvbV4zL2QpXnsxLzV9KSwgeSA9ICJEZXB0aCAobSkiKSArIHRoZW1lKGxlZ2VuZC5wb3MgPSAibm9uZSIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IFBob3RpY0Jhc2UsIGNvbG9yID0gImRhcmtncmVlbiIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBPTVpCYXNlLCBjb2xvciA9ICJkYXJrYmx1ZSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBPTVpUb3AsIGNvbG9yID0gImRhcmtibHVlIikKICAjZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gRFZNQmFzZSwgY29sb3IgPSAiZGFya2dvbGRlbnJvZCIsIGx0eSA9ICJkYXNoZWQiKQogICNsYWJzKHggPSAiKERGL0RaKSBeIDEvNSAowrVtb2wgQy9tXjMvZCkgXiAxLzUiKQoKcGx0RGVsdGEzCiNwbG90bHk6OmdncGxvdGx5KHBsdDFwb3MpCmBgYAoKIyMgQ29tYmluaW5nIHRoZSBwbG90cwoKV2l0aGluIHBhbmVsIGRyYXdpbmcKCgpgYGB7ciBmaWcuaGVpZ2h0ID0gNSwgZmlnLndpZHRoID0gNX0KcGdUb3AgPC0gZ2dkcmF3KHBsdEZseE5vTGVnZW5kIAogICAgICAgKSArCiAgZHJhd19wbG90KHBsdEZseFpvb20sIC40LCAuMjUsIC41NSwgLjYwKSArCiAgZHJhd19wbG90X2xhYmVsKAogICAgYygiIiwiQiIpLAogICAgYyguMDUsIDAuNTUpLAogICAgYygxLCAwLjg1KSwKICAgIHNpemUgPSAxNgogICkKcGdUb3AKYGBgCnBnQm90dG9tIDwtIHBsb3RfZ3JpZChwbHREZWx0YTMsIHBsdEZseExlZ2VuZCAsIHJlbF93aWR0aHMgPSBjKDMsIDEpLCBsYWJlbHMgPSBjKCJDIiwgIiIpLCBsYWJlbF9zaXplID0gMTQpCgoKCgpJIGRvbid0IGtub3cgd2hhdHMgZ29pbmcgb24gYmVsb3cgaGVyZQoKYGBge3IgZmlnLmhlaWdodCA9IDksIGZpZy53aWR0aCA9IDV9CnBnQm90dG9tIDwtIHBsdERlbHRhMyAgKyBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtMiwgeG1heCA9IC0xLjE1LCB5bWluID0gMTcwLCB5bWF4ID0gMTAwMCksIGNvbG91ciA9ICJncmF5NTAiLCBmaWxsID0gIndoaXRlIiwgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKyBkcmF3X3Bsb3QocGx0Rmx4TGVnZW5kICwgLTEuOSwgLTU3NSwgLjcpCnBnQm90aCA8LSBwbG90X2dyaWQocGdUb3AgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgdW5pdHMgPSAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgcGdCb3R0b20gKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgdW5pdHMgPSAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYyg0LCA0KSwgbGFiZWxzID0gYygiQSIsICJDIiksIGxhYmVsX3NpemUgPSAxNikKcGdCb3RoCgpnZ3NhdmUoImZpZ3VyZXMvRmx1eERlZXBEaXZlLnBuZyIpCmdnc2F2ZSgiZmlndXJlcy9GbHV4RGVlcERpdmUuc3ZnIikKYGBgCgoKIyMgU3VtbWFyeSBzdGF0cwpUZXN0IGZvciBkYXkgdG8gZGF5IGFuZCBob3VybHkgdmFyaWFiaWxpdHkgaW4gcmF0ZSBvZiBjaGFuZ2Ugb2YgZmx1eCAoZmlmdGggcm9vdCB0cmFuc2Zvcm1lZCkKIAoKVGhlcmUgaXMgdmFyaWFiaWxpdHkgd2l0aCByZXNwZWN0IHRvIGRlcHRoLCBhbmQgZGF5IGFuZCBob3VyCkRlcHRoIHAgPSAwLjAzIFJeMiA9IDAuMDg4LiBBZGQgYWZmZWN0IG9mIGRheSAgcCA9IDAuMDA0LCBleHRyYSBSXjIgPSAwLjExLCBBZGQgYWZmZWN0IG9mIGhvdXIgcCA9IDAuMDIgZXh0cmEgUjIgPSAwLjEyCgpgYGB7cn0KYmRzQWRkVGltZSA8LSBiZHMgJT4lIAogIG11dGF0ZShIb3VyID0gaG91cih0aW1lKSArIG1pbnV0ZSh0aW1lKS82MCwgRGF5ID0gZGF5KHRpbWUpICsgaG91cih0aW1lKS8yNCArIG1pbnV0ZSh0aW1lKS8yNC82MCkKCkRGRzEgPC0gZ2FtKHByYWNtYTo6bnRocm9vdChERi9EWiwgNSl+IHMoZGVwdGgsIGsgPSAzKSArIHMoRGF5LCBrID0gMykgKyBzKEhvdXIsIGsgPSA0LCBicyA9ICJjYyIpLCBrbm90cyA9IGxpc3QoSG91ciA9IGMoMCwgMjQpKSwgZGF0YSA9IGJkc0FkZFRpbWUgJT4lIGZpbHRlcihkZXB0aCA+PSAyNTAgJiBkZXB0aCA8PTUwMCAmIHByb2plY3QgPT0gIkVUTlAiKSkKCkRGRzIgPC0gZ2FtKHByYWNtYTo6bnRocm9vdChERi9EWiwgNSkgfiBzKGRlcHRoLCBrID0gMykgKyBzKERheSwgayA9IDMpLCBkYXRhID0gYmRzQWRkVGltZSAlPiUgZmlsdGVyKGRlcHRoID49IDI1MCAmIGRlcHRoIDw9NTAwICYgcHJvamVjdCA9PSAiRVROUCIpKQoKREZHMyA8LSBnYW0ocHJhY21hOjpudGhyb290KERGL0RaLCA1KSB+IHMoZGVwdGgsIGsgPSAzKSwgZGF0YSA9IGJkc0FkZFRpbWUgJT4lIGZpbHRlcihkZXB0aCA+PSAyNTAgJiBkZXB0aCA8PTUwMCAmIHByb2plY3QgPT0gIkVUTlAiKSkKCkRGR19EYXlPbmx5IDwtIGdhbShwcmFjbWE6Om50aHJvb3QoREYvRFosIDUpIH4gIHMoRGF5LCBrID0gMyksIGRhdGEgPSBiZHNBZGRUaW1lICU+JSBmaWx0ZXIoZGVwdGggPj0gMjUwICYgZGVwdGggPD01MDAgJiBwcm9qZWN0ID09ICJFVE5QIikpCgpERkdfTm9GaWZ0aCA8LSBnYW0ocHJhY21hOjpudGhyb290KERGL0RaLCAxKX4gcyhkZXB0aCwgayA9IDMpICsgcyhEYXksIGsgPSAzKSArIHMoSG91ciwgayA9IDQsIGJzID0gImNjIiksIGtub3RzID0gbGlzdChIb3VyID0gYygwLCAyNCkpLCBkYXRhID0gYmRzQWRkVGltZSAlPiUgZmlsdGVyKGRlcHRoID49IDI1MCAmIGRlcHRoIDw9NTAwICYgcHJvamVjdCA9PSAiRVROUCIpKQoKc3VtbWFyeShERkcxKQoKc3VtbWFyeShERkdfRGF5T25seSkKCnN1bW1hcnkoREZHX05vRmlmdGgpCgoKCgojIHN1bW1hcnkoREZHMikKIyBzdW1tYXJ5KERGRzMpCiMgCiMgc3VtbWFyeShERkcxKSRyLnNxIC0gc3VtbWFyeShERkcyKSRyLnNxCiMgc3VtbWFyeShERkcyKSRyLnNxIC0gc3VtbWFyeShERkczKSRyLnNxCiMgc3VtbWFyeShERkczKSRyLnNxCmBgYAoKVGltZSBpcyBub3cgY29udGludW91cyBkYXkgYW5kIGhvdXIKClBsb3Qgb2YgdGhlIGdhbXMgYWJvdmUKYGBge3IgZmlnLmhlaWdodCA9IDgsIGZpZy53aWR0aCA9IDEwfQojcGxvdC5uZXcoKQpGbHV4R2FtUGxvdCA8LSBmdW5jdGlvbigpewogIHBhcihtZnJvdyA9IGMoMiwyKSkKICBwbG90KERGRzEpCiAgYWJsaW5lKGggPSAwLCBjb2wgPSAiZ3JheTMwIiwgbHdkID0gMikKICBtdGV4dChleHByZXNzaW9uKGJvbGQoIkMiKSksIHNpZGUgPSAzLCBsaW5lID0gMCwgYWRqID0gMCwgY2V4ID0gMikKICBwYXIobWZnID0gYygxLDEpKQogIGFibGluZShoID0gMCwgY29sID0gImdyYXkzMCIsIGx3ZCA9IDIpCiAgbXRleHQoZXhwcmVzc2lvbihib2xkKCJBIikpLCBzaWRlID0gMywgbGluZSA9IDAsIGFkaiA9IDAsIGNleCA9IDIpCiAgcGFyKG1mZyA9IGMoMSwyKSkKICBhYmxpbmUoaCA9IDAsIGNvbCA9ICJncmF5MzAiLCBsd2QgPSAyKQogIG10ZXh0KGV4cHJlc3Npb24oYm9sZCgiQiIpKSwgc2lkZSA9IDMsIGxpbmUgPSAwLCBhZGogPSAwLCBjZXggPSAyKQp9CgpGbHV4R2FtUGxvdCgpCgpwbmcoZmlsZW5hbWUgPSAiLi9maWd1cmVzL0ZsdXhHYW1QbG90LnBuZyIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDgsIHVuaXRzID0gImluIiwgcmVzID0gMjAwKQpGbHV4R2FtUGxvdCgpCmRldi5vZmYoKQpgYGAKCgoKIyBGaWd1cmUgNwojIyBEaWZmZXJlbmNlIGZyb20gbW9kZWwgZXhwZWN0YXRpb25zCgoodSBtb2wgQyAvIG1eMyAvIGRheSkKYGBge3IgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDR9CmRpc2FnRmlnIDwtIGJkcyAlPiUgZmlsdGVyKHByb2plY3QgPT0gIkVUTlAiKSAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBkZXB0aCwgeCA9IHByYWNtYTo6bnRocm9vdChvc3BzRFosIDMpLCBzaGFwZSA9IGZhY3RvcihkYXkodGltZSkpLCBmaWxsID0gaG91cih0aW1lKSwgZ3JvdXAgPSBmYWN0b3IodGltZSkpKSArIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYygxMDAwLCAwKSwgYnJlYWtzID0geWJyZWFrcywgbGFiZWxzID0geWxhYmVscykgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xLCAxKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJEYXkgb2YgTW9udGgiLCB2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArCiAgI2xhYnMoeCA9IGJxdW90ZSgiT2JzZXJ2ZWQgLSBNb2RlbGVkIFNtYWxsIFBhcnRpY2xlIEZsdXgifijOvG1vbC9tXjMvZGF5KSksIHkgPSAiRGVwdGggKG0pIikgKwogIGxhYnMoeCA9IHBhc3RlKCJEZXZpYXRpb24gZnJvbSBNb2RlbCIsIGV4cHJlc3Npb24oKM68bW9sL21eMy9kYXkpKSksIHkgPSAiRGVwdGggKG0pIikgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKG5hbWUgPSAiSG91ciBvZiBEYXkiLCBicmVha3MgPSBjKDAsIDYsIDEyLCAxOCwgMjQpLCBjb2xvcnMgPSBjKCJibGFjayIsICJibHVlIiwgIndoaXRlIiwgIm9yYW5nZSIsICJibGFjayIpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gUGhvdGljQmFzZSwgY29sb3IgPSAiZGFya2dyZWVuIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWkJhc2UsIGNvbG9yID0gImRhcmtibHVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWlRvcCwgY29sb3IgPSAiZGFya2JsdWUiKSAjKwogICNnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBEVk1CYXNlLCBjb2xvciA9ICJkYXJrZ29sZGVucm9kIiwgbHR5ID0gImRhc2hlZCIpCmRpc2FnRmlnCiNnZ3NhdmUoIi4uZmlndXJlcy9GbHV4U2l6ZVNoaWZ0LnN2ZyIKCiBnZ3NhdmUoImZpZ3VyZXMvRmx1eFNpemVTaGlmdC5wbmciKQogZ2dzYXZlKCJmaWd1cmVzL0ZsdXhTaXplU2hpZnQuc3ZnIikKYGBgCgojIyBTdW1tYXJ5IHN0YXRpc3RpY3MKCmBgYHtyfQojIGJkc0FkZFRpbWUgPC0gYmRzICU+JQojICAgbXV0YXRlKEhvdXIgPSBob3VyKHRpbWUpLCBEYXkgPSBkYXkodGltZSkpCgpiZHNBZGRUaW1lIDwtIGJkcyAlPiUKICBtdXRhdGUoSG91ciA9IGhvdXIodGltZSkgKyBtaW51dGUodGltZSkvNjAsIERheSA9IGRheSh0aW1lKSArIGhvdXIodGltZSkvMjQgKyBtaW51dGUodGltZSkvMjQvNjApCgpPWkcxIDwtIGdhbShvc3BzRFogfiBzKGRlcHRoLCBrID0gMykgKyBzKERheSwgayA9IDMpICsgcyhIb3VyLCBrID0gNCwgYnMgPSAiY2MiKSwga25vdHMgPSBsaXN0KEhvdXIgPSBjKDAsIDI0KSksIGRhdGEgPSBiZHNBZGRUaW1lICU+JSBmaWx0ZXIoZGVwdGggPj0gUGhvdGljQmFzZSAmIGRlcHRoIDw9NTAwICYgcHJvamVjdCA9PSAiRVROUCIpKQoKT1pHMiA8LSBnYW0ob3Nwc0RaIH4gcyhkZXB0aCwgayA9IDMpICsgcyhEYXksIGsgPSAzKSwgZGF0YSA9IGJkc0FkZFRpbWUgJT4lIGZpbHRlcihkZXB0aCA+PSBQaG90aWNCYXNlICYgZGVwdGggPD01MDAgJiBwcm9qZWN0ID09ICJFVE5QIikpCgpPWkczIDwtIGdhbShvc3BzRFogfiBzKGRlcHRoLCBrID0gMyksIGRhdGEgPSBiZHNBZGRUaW1lICU+JSBmaWx0ZXIoZGVwdGggPj0gUGhvdGljQmFzZSAmIGRlcHRoIDw9NTAwICYgcHJvamVjdCA9PSAiRVROUCIpKQoKc3VtbWFyeShPWkcxKQpzdW1tYXJ5KE9aRzIpCnN1bW1hcnkoT1pHMykKCnN1bW1hcnkoT1pHMSkkci5zcSAtIHN1bW1hcnkoT1pHMikkci5zcSAjIEV4dHJhIGZyb20gSG91cgpzdW1tYXJ5KE9aRzIpJHIuc3EgLSBzdW1tYXJ5KE9aRzMpJHIuc3EgIyBFeHRyYWZyb20gRGF5CnN1bW1hcnkoT1pHMykkci5zcSAjIERlcHRoCmBgYAoKUGxvdCBvZiB0aG9zZSBnYW1zIEZpZ3VyZSBTMTAKCmBgYHtyfQpPU01TR2FtUGxvdCA8LSBmdW5jdGlvbigpewogIHBhcihtZnJvdyA9IGMoMiwyKSkKICBwbG90KE9aRzEpCiAgCiAgcGFyKG1mZyA9IGMoMSwxKSkKICBhYmxpbmUoaCA9IDAsIGNvbCA9ICJncmF5MzAiLCBsd2QgPSAyKQogIG10ZXh0KGV4cHJlc3Npb24oYm9sZCgiQSIpKSwgc2lkZSA9IDMsIGxpbmUgPSAwLCBhZGogPSAwLCBjZXggPSAyKQogIHBhcihtZmcgPSBjKDEsMikpCiAgYWJsaW5lKGggPSAwLCBjb2wgPSAiZ3JheTMwIiwgbHdkID0gMikKICBtdGV4dChleHByZXNzaW9uKGJvbGQoIkIiKSksIHNpZGUgPSAzLCBsaW5lID0gMCwgYWRqID0gMCwgY2V4ID0gMikKICBwYXIobWZnID0gYygyLDEpKQogIGFibGluZShoID0gMCwgY29sID0gImdyYXkzMCIsIGx3ZCA9IDIpCiAgbXRleHQoZXhwcmVzc2lvbihib2xkKCJDIikpLCBzaWRlID0gMywgbGluZSA9IDAsIGFkaiA9IDAsIGNleCA9IDIpCn0KCk9TTVNHYW1QbG90KCkKCnBuZyhmaWxlbmFtZSA9ICIuL2ZpZ3VyZXMvT1NNU0dhbVBsb3QucG5nIiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCwgdW5pdHMgPSAiaW4iLCByZXMgPSAyMDApCk9TTVNHYW1QbG90KCkKCmRldi5vZmYoKQpgYGAKCgoKCiMgRmlndXJlIDMKIyMgVHJhcCBkYXRhCmBgYHtyfQp0cmFwRmx1eDMgPC0gcmVhZF9jc3YoImRhdGFPdXQvZmx1eE1TX2Rpc3RpbGxlZC5jc3YiKQpVVlBGbHV4Q29tYiA8LSByZWFkX2NzdigiZGF0YU91dC9Db21iaW5lZFByb2ZpbGVGbHV4RXN0X0RTLmNzdiIpClVWUEZsdXhPRSA8LSByZWFkX2NzdigiZGF0YU91dC9PYnNlcnZlZFZzRXhwZWN0ZWRGbHV4LmNzdiIpCmBgYAoKCgpgYGB7cn0KCmZsdXhNU19kaXN0aWxsZWRfdG9QbG90IDwtIHRyYXBGbHV4MyAlPiUKICBtdXRhdGUoU2FtcGxlVHlwZSA9IHJlY29kZShTYW1wbGVUeXBlLCBgcGx1cy5wYCA9ICJwbHVzLXBhcnRpY2xlcyIsIHRvcCA9ICJ0b3AtY29sbGVjdG9yIikpCmBgYAoKUmVtb3ZlIHRyYXBzIHdoZXJlIG1hc3Mgc3BlYyBkaWRuJ3Qgd29yayBjb3JyZWN0bHkKMi0xNyAxNTAKMS0xMiA3M20KMS0xMiAxNDgKMi0xNCAxMDAKfChUcmFwSUQgPT0gIjItMTciICYgRGVwdGggPT0gMTUwKQpgYGB7cn0KZmx1eE1TX2Rpc3RpbGxlZF90b1Bsb3QyIDwtIGZsdXhNU19kaXN0aWxsZWRfdG9QbG90ICU+JQogZmlsdGVyKCEoKFRyYXBJRCA9PSAiMS0xMiIpIHwgKFRyYXBJRCA9PSAiMi0xNCIgJiBEZXB0aCA9PSAxMDApfChUcmFwSUQgPT0gIjItMTciICYgRGVwdGggPT0gMTUwKSkpCiNmbHV4TVNfZGlzdGlsbGVkX3RvUGxvdDIKYGBgCgoKVHJhcHMgd2hlcmUgbWFzcyBzcGVjIGRpZG4ndCB3b3JrLgoKCmBgYHtyfQpVVlBGbHV4UGxvdDAwIDwtIFVWUEZsdXhDb21iICU+JSAKICBnZ3Bsb3QoYWVzKHkgPSBkZXB0aCkpICArIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDEwMDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMjAwKSkgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBEZXB0aCwgeCA9IENfZmx1eF91bW9sLCBzaGFwZSA9IFRyYXBUeXBlLCBJRCA9IFRyYXBJRCksCiAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCBzdHJva2UgPSAxLCBzaXplID0gNSwgZGF0YSA9IGZsdXhNU19kaXN0aWxsZWRfdG9QbG90MikgKwogIGdlb21fbGluZShhZXMoeCA9IEZsdXgpLCBzaXplID0gMSwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IC0xLCB5ID0gLTEsIHNpemUgPSAiVVZQIEVzdGltYXRlIikpICsgIyBkdW1teSBwb2ludCBmb3IgdGhlIGxlZ2VuZAogIGdlb21fcG9pbnQoYWVzKHggPSB0b3RfZmx1eDIpLCBzaXplID0gMywgc2hhcGUgPSAyMSwgY29sb3IgPSAid2hpdGUiLCBmaWxsID0gImJsYWNrIiwgZGF0YSA9IFVWUEZsdXhPRSkgKwpzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygyNSwgMjIpKSsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSAxLCBuYW1lID0gIiIpICsKICB5bGFiKCJEZXB0aCAobSkiKSArCiAgI3hsYWIoZXhwcmVzc2lvbihGbHV4IMK1bW9sQy9tXjIvZGF5KSkgKwogIHhsYWIoZXhwcmVzc2lvbihwYXN0ZSgieCBheGlzICIsIHJpbmcoQSleMikpKSArCiAgeGxhYihleHByZXNzaW9uKHBhc3RlKCJGbHV4ICjCtSBtb2wgQy8iLCBtXjIsICIvZGF5KSIpKSkgKwogIAogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2hhcGUgPSAyMSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gUGhvdGljQmFzZSwgY29sb3IgPSAiZGFya2dyZWVuIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWkJhc2UsIGNvbG9yID0gImRhcmtibHVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWlRvcCwgY29sb3IgPSAiZGFya2JsdWUiKQogIHRoZW1lX2Nvd3Bsb3QoKSArIAogIHRoZW1lKAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC41LCAwLjQpLAogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUpLAogICAgICAgIGxlZ2VuZC5tYXJnaW4gPSBtYXJnaW4oLTEwLCA1LCAxMCwgNSkKICApIAojIFVWUEZsdXhQbG90IDwtIFVWUEZsdXhQbG90MDAgKwojICAgZ2VvbV9yZWN0KGRhdGEgPSBkYXRhLmZyYW1lKHByb2plY3QgPSAiRVROUCIpLCBhZXMoeG1pbiA9IDE1LCB4bWF4ID0gMzIsIHltaW4gPSA0NSwgeW1heCA9IDE5NSksIGNvbG91ciA9ICJyZWQiLCBmaWxsID0gTkEsIGluaGVyaXQuYWVzID0gRkFMU0UpCgpVVlBGbHV4UGxvdDAwCgpnZ3NhdmUoImZpZ3VyZXMvRml0dGVkRmx1eC5wbmciKQpnZ3NhdmUoImZpZ3VyZXMvRml0dGVkRmx1eC5zdmciKQpgYGAKCiMgRmlndXJlIFMyCiMjIEV4YW1wbGUgcGFydGljbGUgc2l6ZSBkaXN0cmlidXRpb24KCmBgYHtyIGZpZy53aWR0aD0gMTB9ClRQUGxvdCA8LSBiZXMgJT4lIGZpbHRlcihwcm9maWxlID09ICJzdG5fMDQzIikgJT4lIGdyb3VwX2J5KGxiKSAlPiUgZ2dwbG90KGFlcyh4ID0gVG90YWxQYXJ0aWNsZXMsIHkgPSBkZXB0aCwgY29sID0gbG9nKGxiKSwgZ3JvdXAgPSBsYikpICsgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoMTAwMCwgMCkpICsgZ2VvbV9wb2ludCgpICsgc2NhbGVfeF9sb2cxMCgpICsgc2NhbGVfY29sb3JfdmlyaWRpc19jKCkgKyBnZW9tX3BhdGgoKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNSkgKyBsYWJzKHkgPSAiRGVwdGggKG0pIiwgeCA9ICJUb3RhbFBhcnRpY2xlcyBPYnNlcnZlZCAoIykiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gUGhvdGljQmFzZSwgY29sb3IgPSAiZGFya2dyZWVuIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWkJhc2UsIGNvbG9yID0gImRhcmtibHVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWlRvcCwgY29sb3IgPSAiZGFya2JsdWUiKQoKbm5wUGxvdCA8LSBiZXMgJT4lIGZpbHRlcihwcm9maWxlID09ICJzdG5fMDQzIikgJT4lIGdyb3VwX2J5KGxiKSAlPiUgZ2dwbG90KGFlcyh4ID0gbl9ucGFydGljbGVzLCB5ID0gZGVwdGgsIGNvbCA9IGxvZyhsYiksIGdyb3VwID0gbGIpKSArIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDEwMDAsIDApKSArIGdlb21fcG9pbnQoKSArIHNjYWxlX3hfbG9nMTAoKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYygpICsgZ2VvbV9wYXRoKCkgKwogICNnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDUpICsKICBsYWJzKHkgPSAiRGVwdGggKG0pIiwgeCA9ICJCaW5zaXplIGFuZCBWb2x1bWUgTm9ybWFsaXplZCBQYXJ0aWNsZXMgKCMvTC9tbSkiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gUGhvdGljQmFzZSwgY29sb3IgPSAiZGFya2dyZWVuIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWkJhc2UsIGNvbG9yID0gImRhcmtibHVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWlRvcCwgY29sb3IgPSAiZGFya2JsdWUiKQoKRml0UGxvdCA8LSBiZXMgJT4lIGZpbHRlcihwcm9maWxlID09ICJzdG5fMDQzIikgJT4lIGdyb3VwX2J5KGxiKSAlPiUgZ2dwbG90KGFlcyh4ID0gbm5wX3Ntb290aCwgeG1pbiA9IG5ucF9sb3dlciwgeG1heCA9IG5ucF91cHBlciwgeSA9IGRlcHRoLCBjb2wgPSBsb2cobGIpLCBncm91cCA9IGxiKSkgKyBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYygxMDAwLCAwKSkgKyBnZW9tX3BvaW50KCkgKyBzY2FsZV94X2xvZzEwKCkgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2MoKSArIGdlb21fcGF0aCgpICsKICAjZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1KSArCiAgbGFicyh5ID0gIkRlcHRoIChtKSIsIHggPSAiU21vb3RoZWQgLSBOb3JtYWxpemVkIFBhcnRpY2xlcyAoIy9ML21tKSIpICsgZ2VvbV9lcnJvcmJhcih3aWR0aCA9IDEwLCBhbHBoYSA9IDAuNSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IFBob3RpY0Jhc2UsIGNvbG9yID0gImRhcmtncmVlbiIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBPTVpCYXNlLCBjb2xvciA9ICJkYXJrYmx1ZSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBPTVpUb3AsIGNvbG9yID0gImRhcmtibHVlIikKCm5wTGVnZW5kIDwtIGdldF9sZWdlbmQoRml0UGxvdCArIHRoZW1lKGxlZ2VuZC5ib3gubWFyZ2luID0gbWFyZ2luKDAsIDAsIDQwLCAyMDApKSArIGxhYnMoY29sID0gZXhwcmVzc2lvbihsb2dbZV0oU2l6ZSAobW0pKSkpKQoKcGxvdF9ncmlkKAogIFRQUGxvdCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgbm5wUGxvdCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgbnBMZWdlbmQgLAogIEZpdFBsb3QgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLCAKICBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiIiwgIkMiKQopCgpnZ3NhdmUoImZpZ3VyZXMvQWxsUGFydGljbGVTaXplcy5zdmciKQpnZ3NhdmUoImZpZ3VyZXMvQWxsUGFydGljbGVTaXplcy5wbmciKQpgYGAKCgojIEZpZ3VyZSA2CiMjIFdlYmVyIEJpYW5jaGkgRmlncwoKIyMjIEp1c3Qgc3RhdGlvbiAwNDMKCldlIGFyZSBzbW9vdGhpbmcgdGhlIHN0YXRpb24gMDQzIGRhdGEsIHdpdGggcmVzcGVjdCB0byBkZXB0aCBhbmQgdGltZS4KV2UgYXJlIHVzaW5nIHRoaXMgc3RhdGlvbiBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IG9uZSB0byBleHRlbmQgcGFzdCAyMDAwbS4gV2UgZmluZCB0aGF0IHRoZSBvdGhlciBwcm9maWxlcyBzZWVtIHRvIGdpdmUgc3RyYW5nZSB2YWx1ZXMgbmVhciB0aGUgZW5kcyBvZiB0aGUgcmFuZ2VzIG9mIHRoZSBnYW1zLgoKYGBge3J9ClNhbWVHYW0gPC0gZ2FtKFRvdGFsUGFydGljbGVzIH5zKGxvZyhsYiksIGxvZyhkZXB0aCkpLCBvZmZzZXQgPSBsb2codm9sICogYmluc2l6ZSksIGZhbWlseSA9IG5iKCksCiAgICBkYXRhID0gYmVzICU+JSBmaWx0ZXIocHJvamVjdCA9PSAiRVROUCIsIGRlcHRoIDw9IDIwMDAsIHByb2ZpbGUgPT0gInN0bl8wNDMiKSkgIyBMb29rcyBnb29kIQpgYGAKCmBgYHtyfQpnYW0uY2hlY2soU2FtZUdhbSkKYGBgCgpgYGB7cn0KYmVzRSA8LSBiZXMgJT4lIGZpbHRlcihwcm9qZWN0ID09ICJFVE5QIikKCmxiX25ldyA8LSBleHAoc2VxKGZyb20gPSBsb2coMC4xKSwgdG8gPSBsb2coMi4xKSwgYnkgPSAwLjA1KSkKdWJfbmV3IDwtIGxlYWQobGJfbmV3KQpiaW5zaXplX25ldyA8LSB1Yl9uZXcgLSBsYl9uZXcKCmxiYnMgPC0gdGliYmxlKGxiID0gbGJfbmV3LCB1YiA9IHViX25ldywgYmluc2l6ZSA9IGJpbnNpemVfbmV3KQoKRXhwYW5kZWQgPC0gZXhwYW5kX2dyaWQobGIgPSBleHAoc2VxKGZyb20gPSBsb2coMC4xKSwgdG8gPSBsb2coMiksIGJ5ID0gMC4wNSkpLCBkZXB0aCA9IHNlcShmcm9tID0gMjAsIHRvID0gMjAwMCwgYnkgPSAyMCksIHRpbWUgPSBhcy5mYWN0b3IodW5pcXVlKGJlc0UkdGltZSkpKSAlPiUgbGVmdF9qb2luKGxiYnMsIGJ5ID0gImxiIikKClByZWQgPC0gZXhwKHByZWRpY3QoU2FtZUdhbSwgRXhwYW5kZWQpKQpgYGAKCmBgYHtyfQpUb1Bsb3QgPC0gYmluZF9jb2xzKEV4cGFuZGVkLCBubnBhcnRpY2xlcyA9IFByZWQpICU+JSBtdXRhdGUodGltZSA9IGFzLmNoYXJhY3Rlcih0aW1lKSkgJT4lIG11dGF0ZShucGFydGljbGVzID0gbm5wYXJ0aWNsZXMgKiBiaW5zaXplKQpgYGAKCmBgYHtyfQpXQkNvbG9yTWFwIDwtIFRvUGxvdCAlPiUgZmlsdGVyKGxiIDw9IDIpICU+JQogIGdncGxvdChhZXMoeCA9IGxiLCB5ID0gZGVwdGgsIGZpbGwgPSBsb2cxMChubnBhcnRpY2xlcyksIHogPSBsb2cxMChubnBhcnRpY2xlcykpKSArIGdlb21fdGlsZSgpICsgc2NhbGVfZmlsbF92aXJpZGlzX2MobmFtZSA9IGV4cHJlc3Npb24obG9nWzEwXShQYXJ0aWNsZXMvbV4zL21tKSkpICsgc2NhbGVfeV9yZXZlcnNlKCkgKyBzY2FsZV94X2xvZzEwKCkgKyBnZW9tX2NvbnRvdXIoY29sb3IgPSAiYmxhY2siKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDE2MCwgY29sb3IgPSAiZGFya2dyZWVuIikgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBPTVpCYXNlLCBjb2xvciA9ICJkYXJrYmx1ZSIpICsgbGFicyh5ID0gIkRlcHRoIChtKSIsIHggPSAiU2l6ZSAobW0pIikgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBPTVpUb3AsIGNvbG9yID0gImRhcmtibHVlIikKV0JDb2xvck1hcApgYGAKCmBgYHtyfQptYkdhbSA8LSBUb1Bsb3QgJT4lIGdyb3VwX2J5KGRlcHRoKSAgJT4lIG5lc3QoKSAlPiUKICBtdXRhdGUobW9kID0gbWFwKGRhdGEsIH5nYW0obG9nKG5ucGFydGljbGVzKSB+IGxvZyhsYiksIGZhbWlseSA9IGdhdXNzaWFuKCksIGRhdGEgPSAuKSkpICU+JSAKICBtdXRhdGUocHNkID0gbWFwX2RibChtb2QsIH5zdW1tYXJ5KC4pJHAuY29lZmZbMl0pKSAKYGBgCgoKCiMjIFBhcnRpY2xlIHNpemUgZGlzdHJpYnV0aW9uLCBzbW9vdGhlZCBvdmVyIGFsbCBzdGF0aW9ucwoKYGBge3J9CnBXQlBTRCA8LSBtYkdhbSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwc2QsIHkgPSBkZXB0aCkpICsgZ2VvbV9wYXRoKCkgKyBzY2FsZV95X3JldmVyc2UoKSAgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxNjAsIGNvbG9yID0gImRhcmtncmVlbiIpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gIE9NWkJhc2UsIGNvbG9yID0gImRhcmtibHVlIikgKyBsYWJzKHkgPSAiRGVwdGggKG0pIiwgeCA9ICJQYXJ0aWNsZSBTaXplIERpc3RyaWJ1dGlvbiBTbG9wZSIpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gT01aVG9wLCBjb2xvciA9ICJkYXJrYmx1ZSIpCnBXQlBTRApgYGAKCiMgU21hbGwgUGFydGljbGUgQmlvbWFzcwpgYGB7cn0KUHViRGYgPC0gVG9QbG90ICU+JSBtdXRhdGUodWJpb21hc3MgPSBucGFydGljbGVzICogbGIgXiBhZ19nbG9iYWwpICU+JSBmaWx0ZXIobGIgPCAwLjUpICU+JSBncm91cF9ieShkZXB0aCkgJT4lIHN1bW1hcml6ZSh1YmlvbWFzcyA9IHN1bSh1YmlvbWFzcykpICU+JSB1bmdyb3VwKCkKcGhvdGljQmlvbWFzcyA8LSBQdWJEZiAlPiUgZmlsdGVyKGRlcHRoIDw9IDE2NSwgZGVwdGggPj0gMTU1KSAlPiUgc3VtbWFyaXplKHViaW9tYXNzID0gbWVhbih1YmlvbWFzcykpICU+JSBwdWxsKHViaW9tYXNzKQpQdWJEZiA8LSBQdWJEZiAlPiUgbXV0YXRlKG5iaW9tYXNzID0gdWJpb21hc3MvcGhvdGljQmlvbWFzcykKcFdCUyA8LSBQdWJEZiAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gbmJpb21hc3MsIHkgPSBkZXB0aCkpICsgZ2VvbV9wYXRoKCkgKyBzY2FsZV95X3JldmVyc2UoKSArIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMS4yKSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxNjAsIGNvbG9yID0gImRhcmtncmVlbiIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwgY29sb3IgPSAiZ3JheTUwIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5NTAiKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWkJhc2UsIGNvbG9yID0gImRhcmtibHVlIikgKyBsYWJzKCB4ID0gIjw1MDAgzrxtIHBhcnRpY2xlIG1hc3MgKG5vcm0uKSIpICArIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgCnBXQlMKYGBgCgojTGFyZ2UgUGFydGljbGUgQmlvbWFzcwpgYGB7cn0KTHViRGYgPC0gVG9QbG90ICU+JSBtdXRhdGUodWJpb21hc3MgPSBucGFydGljbGVzICogbGIgXiBhZ19nbG9iYWwpICU+JSBmaWx0ZXIobGIgPj0gMC41KSAlPiUgZ3JvdXBfYnkodGltZSwgZGVwdGgpICU+JSBzdW1tYXJpemUodWJpb21hc3MgPSBzdW0odWJpb21hc3MpKSAlPiUgdW5ncm91cCAlPiUgZ3JvdXBfYnkoZGVwdGgpICAlPiUgc3VtbWFyaXNlKHViaW9tYXNzID0gbWVhbih1YmlvbWFzcykpCnBob3RpY0Jpb21hc3MgPC0gTHViRGYgJT4lIGZpbHRlcihkZXB0aCA8PSAxNjUsIGRlcHRoID49MTU1KSAlPiUgc3VtbWFyaXplKHViaW9tYXNzID0gbWVhbih1YmlvbWFzcykpICU+JSBwdWxsKHViaW9tYXNzKQpMdWJEZiA8LSBMdWJEZiAlPiUgbXV0YXRlKG5iaW9tYXNzID0gdWJpb21hc3MvcGhvdGljQmlvbWFzcykKcFdCTCA8LSBMdWJEZiAlPiUgZ2dwbG90KGFlcyh4ID0gbmJpb21hc3MsIHkgPSBkZXB0aCkpICsgZ2VvbV9wYXRoKCkgKyBzY2FsZV95X3JldmVyc2UoKSArIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSkpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMTYwLCBjb2xvciA9ICJkYXJrZ3JlZW4iKSArIGxhYnMoIHggPSAi4omlNTAwIHBhcnRpY2xlIG1hc3MgKG5vcm0uKSIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwgY29sb3IgPSAiZ3JheTUwIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5NTAiKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IE9NWkJhc2UsIGNvbG9yID0gImRhcmtibHVlIikgKyB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpIApwV0JMCmBgYAoKIyMjIENvbWJpbmUgdGhlIHRocmVlIGxvd2VyIHBhbm5lbHMKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0PTN9CldCRmlnNSA8LSBwbG90X2dyaWQocFdCUFNELCBwV0JTLHBXQkwsIG5yb3cgPSAxLCBsYWJlbHMgPSBjKCJCIiwgIkMiLCAiRCIpKQpXQkZpZzUKYGBgCgojIyBGb3VyIHBhbmVsIGZpZ3VyZSBvZiBXZWJlciBhbmQgQmlhbmNoaSBlcXVpdmFsZW50IGRhdGEKYGBge3IgZmlnLmhlaWdodCA9IDYsIGZpZy53aWR0aCA9IDguNX0KV0Jjb21iaW5lZCA8LSBwbG90X2dyaWQoV0JDb2xvck1hcCArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMywwLCAzKSwgImNtIikpLCBXQkZpZzUsIG5jb2wgPSAxLCBsYWJlbHMgPSBjKCJBIiwgIiIpKQpXQmNvbWJpbmVkCgpnZ3NhdmUoImZpZ3VyZXMvV0JNb2RlbFZhbGlkYXRpb24ucG5nIikKYGBgCgojIEZpZ3VyZSBTOAojIyBQMTYgRmx1eCAKCiMjIyBGbHV4CmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTR9CnNjaWVudGlmaWNfMTAgPC0gZnVuY3Rpb24oeCkge3BhcnNlKHRleHQ9Z3N1YigiZVxcKyoiLCAiICUqJSAxMF4iLCBzY2FsZXM6OnNjaWVudGlmaWNfZm9ybWF0KCkoeCkpKSB9CiNodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDc2MjI4Ny9ob3ctY2FuLWktZm9ybWF0LWF4aXMtbGFiZWxzLXdpdGgtZXhwb25lbnRzLXdpdGgtZ2dwbG90Mi1hbmQtc2NhbGVzCiNqYWNvYl9tYWduaXR1ZGUgPC0gZnVuY3Rpb24oeCl7ZXhwcmVzc2lvbigxMF5yb3VuZChsb2cxMCh4KSkpfQoKY2IxMCA8LSBjKCcjYTZjZWUzJywnIzFmNzhiNCcsJyNiMmRmOGEnLCcjMzNhMDJjJywnI2ZiOWE5OScsJyNlMzFhMWMnLCcjZmRiZjZmJywnI2ZmN2YwMCcsJyNjYWIyZDYnLCcjNmEzZDlhJykKcGx0Rmx4UDE2IDwtIGJkcyAlPiUgZmlsdGVyKHByb2plY3QgPT0gIlAxNiIpICU+JSAjZmlsdGVyKERGUCA+IDEpICU+JSAjZmlsdGVyKHByb2ZpbGUgJWluJSBjKCJzdG5fMDQzIiwgInAxNm5fMTAwIikpICU+JQogIGdncGxvdChhZXMoeSA9IGRlcHRoLCB4ID0gRmx1eF9TbW9vdGgsIGdyb3VwID0gZmFjdG9yKHRpbWUpKSkgICsgZ2VvbV9wb2ludChzaXplID0gMywgc3Ryb2tlID0gMSkrCiAgZ2VvbV9wYXRoKCkgKwogIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDEwMDAsIDApKSsKICBzY2FsZV94X2xvZzEwKGxpbWl0cyA9IGMoMzUsIDE1MCksYnJlYWtzID0gc2VxKGZyb20gPSAyMCwgdG8gPSAxNTAsIGJ5ID0gMjApKSArCiAgIHNjYWxlX2NvbG9yX2dyYWRpZW50Mihsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gImdyYXk4MCIsIGhpZ2ggPSAicHVycGxlIiwgbWlkcG9pbnQgPSAxMCkgKyBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJEYXkgb2YgTW9udGgiLCB2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKG5hbWUgPSAiSG91ciBvZiBEYXkiLCBicmVha3MgPSBjKDAsIDYsIDEyLCAxOCwgMjQpLCBjb2xvcnMgPSBjKCJibGFjayIsICJibHVlIiwgIndoaXRlIiwgIm9yYW5nZSIsICJibGFjayIpKSArCiAgCmxhYnMoeCA9IGJxdW90ZShTbW9vdGhlZH5GbHV4fijCtW1vbH5DL21eMi9kKSksIHkgPSAiRGVwdGggKG0pIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIwMCwgY29sb3IgPSAiZGFya2dyZWVuIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gLjMpLCBsZWdlbmQuc3BhY2luZyA9IHVuaXQoLjEsICJjbSIpKQojIAojIAojIAojIHBsdEZseE5vTGVnZW5kIDwtIHBsdEZseCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKIyBwbHRGbHhMZWdlbmQgPC0gZ2V0X2xlZ2VuZChwbHRGbHgpCiMgCnBsdEZseFAxNgojICNwbG90bHk6OmdncGxvdGx5KHBsdDEpCmBgYAoKIyMjIFJhdGUgb2YgY2hhbmdlIG9mIGZsdXggLS0gZmlmdGggcm9vdCB0cmFuc2Zvcm1lZApgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD00fQpjYjEwIDwtIGMoJyNhNmNlZTMnLCcjMWY3OGI0JywnI2IyZGY4YScsJyMzM2EwMmMnLCcjZmI5YTk5JywnI2UzMWExYycsJyNmZGJmNmYnLCcjZmY3ZjAwJywnI2NhYjJkNicsJyM2YTNkOWEnKQpwbHREZWx0YTNQMTYgPC0gYmRzICU+JSBmaWx0ZXIocHJvamVjdCA9PSAiUDE2IikgJT4lICNmaWx0ZXIoREZQID4gMSkgJT4lICNmaWx0ZXIocHJvZmlsZSAlaW4lIGMoInN0bl8wNDMiLCAicDE2bl8xMDAiKSkgJT4lCiAgZ2dwbG90KGFlcyh5ID0gZGVwdGgsIHggPSBwcmFjbWE6Om50aHJvb3QoREYvRFosIDUpLCBncm91cCA9IGZhY3Rvcih0aW1lKSkpICArIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHN0cm9rZSA9IDEpKwogIGdlb21fcGF0aCgpICsKICBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYygxMDAwLCAwKSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEsIC4xKSwgYnJlYWtzID0gc2VxKGZyb20gPSAtMiwgdG8gPSAuNzUsIGJ5ID0gMC41KSkgKwogICNzY2FsZV94X2xvZzEwKCkgKwogICBzY2FsZV9jb2xvcl9ncmFkaWVudDIobG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJncmF5ODAiLCBoaWdoID0gInB1cnBsZSIsIG1pZHBvaW50ID0gMTApICsgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRGF5IG9mIE1vbnRoIiwgdmFsdWVzID0gcmVwKDIxOjI1LCAyKSkgKyAKICBzY2FsZV9maWxsX2dyYWRpZW50bihuYW1lID0gIkhvdXIiLCBicmVha3MgPSBjKDAsIDYsIDEyLCAxOCwgMjQpLCBjb2xvcnMgPSBjKCJibGFjayIsICJibHVlIiwgIndoaXRlIiwgIm9yYW5nZSIsICJibGFjayIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDIwMCwgY29sb3IgPSAiZGFya2dyZWVuIikrCiAgbGFicyh4ID0gYnF1b3RlKChERi9EWileezEvNX1+KMK1bW9sQy9tXjMvZCleezEvNX0pLCB5ID0gIkRlcHRoIChtKSIpICsgdGhlbWUobGVnZW5kLnBvcyA9ICJub25lIikKICAjbGFicyh4ID0gIihERi9EWikgXiAxLzUgKMK1bW9sIEMvbV4zL2QpIF4gMS81IikKCnBsdERlbHRhM1AxNgojcGxvdGx5OjpnZ3Bsb3RseShwbHQxcG9zKQpgYGAKCiMjIyBEaWZmZXJlbmNlIGZyb20gbW9kZWwKYGBge3IgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDR9Cm9zbXNfcDE2IDwtIGJkcyAlPiUgZmlsdGVyKHByb2plY3QgPT0gIlAxNiIpICU+JQogIGdncGxvdChhZXMoeSA9IGRlcHRoLCB4ID0gcHJhY21hOjpudGhyb290KG9zcHNEWiwgMyksIGdyb3VwID0gZmFjdG9yKHRpbWUpKSkgKyBnZW9tX3BvaW50KHNpemUgPSAzKSArIGdlb21fcGF0aCgpICsgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoMTAwMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSwgMSkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRGF5IG9mIE1vbnRoIiwgdmFsdWVzID0gcmVwKDIxOjI1LCAyKSkgKyBsYWJzKHggPSAiT2JzZXJ2ZWQgLSBNb2RlbGVkIFNtYWxsIFBhcnRpY2xlIEZsdXggXG4gwrVtb2wvbV4zL2RheSIpICsKICBzY2FsZV9maWxsX2dyYWRpZW50bihuYW1lID0gIkhvdXIgb2YgRGF5IiwgYnJlYWtzID0gYygwLCA2LCAxMiwgMTgsIDI0KSwgY29sb3JzID0gYygiYmxhY2siLCAiYmx1ZSIsICJ3aGl0ZSIsICJvcmFuZ2UiLCAiYmxhY2siKSkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBQaG90aWNCYXNlLCBjb2xvciA9ICJkYXJrZ3JlZW4iKSAKcGxvdGx5OjpnZ3Bsb3RseShvc21zX3AxNikKI2dnc2F2ZSgiLi5maWd1cmVzL0ZsdXhTaXplU2hpZnQuc3ZnIgoKYGBgCgojIyMgQ29tYmluZSBldmVyeXRoaW5nIHRvZ2V0aGVyCmBgYHtyIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQ9OH0KcGxvdF9ncmlkKAogIHBsdEZseFAxNiwKICBwbHREZWx0YTNQMTYsCiAgb3Ntc19wMTYKKQoKZ2dzYXZlKCJmaWd1cmVzL1AxNkZsdXhSZWxhdGUuc3ZnIikKZ2dzYXZlKCJmaWd1cmVzL1AxNkZsdXhSZWxhdGUucG5nIikKYGBgCgojIEZpZ3VyZSBTMTAKIyMgRmx1eCBhdHRlbnVhdGlvbiBleGFtcGxlCgpUYWtlIG9uZSBwcm9maWxlLCBhdHRlbnVhdGUgaXQsIGFuZCBzaG93IHdoYXQgaXQgbG9va3MgbGlrZQpgYGB7cn0Kc291cmNlKCJNb2RlbFN0dWZmLlIiKQpgYGAKCgpgYGB7cn0Kc2Nhbl9mb3JfZXhhbXBsZSA8LSBiZHMgJT4lIGZpbHRlcihwcm9qZWN0ID09ICJFVE5QIiwgZGVwdGggPCA1MDAsIGRlcHRoID4gMjAwKSAlPiUgc2VsZWN0KHByb2ZpbGUsIGRlcHRoLCBERlAsIHVzZV90aGlzX0RGUCwgb3Nwc0RaKQoKI2xvY19zdGF0aW9uID0gInN0bl8wMzYiCmxvY19zdGF0aW9uID0gInN0bl8wNDMiCmxvY19kZXB0aCA9IDIyNQpsb2NfcHJldl9kZXB0aCA9IDExMi41CgphbGxERlBzIDwtIGJkcyAlPiUgZmlsdGVyKHByb2ZpbGUgPT0gbG9jX3N0YXRpb24sIGRlcHRoID49IGxvY19wcmV2X2RlcHRoLCBkZXB0aCA8PSBsb2NfZGVwdGgpICU+JSBzdW1tYXJpemUoREZQID0gcHJvZChERlApLCB1c2VfdGhpc19ERlAgPSBwcm9kKHVzZV90aGlzX0RGUCkpCgpsb2NfREZQIDwtICBhbGxERlBzICU+JSBwdWxsKERGUCkKbG9jX3VzZV9ERlAgPC0gYWxsREZQcyAlPiUgcHVsbCh1c2VfdGhpc19ERlApCgoKZm9yX3NpbmdsZV9kaXNhZyA8LSBiZXMgJT4lIGZpbHRlcihwcm9maWxlID09IGxvY19zdGF0aW9uLCBkZXB0aCAlaW4lIGMobG9jX3ByZXZfZGVwdGgsIGxvY19kZXB0aCkpICU+JSBzZWxlY3QoZGVwdGgsIGxiLCBubnBfc21vb3RoKSAlPiUKICBtdXRhdGUoZGVwdGggPSByZWNvZGUoZGVwdGgsIGAxMTIuNWAgPSAiU2hhbGxvdyIsIGAyMjVgID0gIkRlZXAiKSkgJT4lICMgSSBoYXZlIG5vIGlkZWEgaG93IHRvIG5vdCBoYXJkIGNvZGUgdGhpcyBiaXQKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZGVwdGgsIHZhbHVlc19mcm9tID0gbm5wX3Ntb290aCkgCgp3aXRoX2Rpc2FnIDwtIGZvcl9zaW5nbGVfZGlzYWcgJT4lCiAgbXV0YXRlKFByZWRpY3RlZF9EZWVwID0gcmVtaW5fc21vb3RoX3NodWZmbGUoU2hhbGxvdywgbG9jX3VzZV9ERlApKSAKI3JlbWluX3Ntb290aF9zaHVmZmxlKGZvcl9zaW5nbGVfZGlzYWckU2hhbGxvdyxsb2NfdXNlX0RGUCkKCmZvcl9wbG90X2Rpc2FnIDwtIHdpdGhfZGlzYWcgJT4lIHBpdm90X2xvbmdlcihjb2xzID0gLWxiKSAlPiUgI2ZpbHRlcihsYiA8PSA1KSAlPiUKICBtdXRhdGUobmFtZSA9IGZhY3RvcihuYW1lLCBsZXZlbHMgPSBjKCJTaGFsbG93IiwgIkRlZXAiLCAiUHJlZGljdGVkX0RlZXAiKSkpICU+JQogIG11dGF0ZShuYW1lID0gcmVjb2RlX2ZhY3RvcihuYW1lLCBTaGFsbG93ID0gIlNoYWxsb3cgKDExMi41bSkiLCBEZWVwID0gIkRlZXAgKDIyNW0pIiwgUHJlZGljdGVkX0RlZXAgPSAiUHJlZGljdGVkIERlZXAgKDIyNW0pIikpCgpmb3JfcGxvdF9kaXNhZyAlPiUgZ2dwbG90KGFlcyh4ID0gbGIsIHkgPSB2YWx1ZSwgc2hhcGUgPSBuYW1lKSkgKyBnZW9tX3BvaW50KCkgKyBzY2FsZV94X2xvZzEwKCkgKyBzY2FsZV95X2xvZzEwKCkgKyBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxLCA2LCAzKSkgKyB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgbGFicyh4ID0gIlBhcnRpY2xlIFNpemUgKG1tKSIsIHkgPSAiTm9ybWFsaXplZCBQYXJ0aWNsZSBBYnVuZGFuY2UgKCMvTC9tbSkiKQoKZ2dzYXZlKCJmaWd1cmVzL0Rpc2FnRXhhbXBsZS5wbmciKQpnZ3NhdmUoImZpZ3VyZXMvRGlzYWdFeGFtcGxlLnN2ZyIpCmBgYAoKCgo=